Мы разработали веб-приложение (PHP & Mysql), которое в настоящее время является одним клиентом, то есть пользователи с разными уровнями разрешений являются частью одной и той же компании и, следовательно, имеют доступ к тем же данным. Теперь мы планируем преобразовать его в платформу с несколькими клиентами, то есть другой набор пользователей должен иметь доступ к различным наборам данных.
Очевидным способом является разделение данных путем добавления столбца "владелец" ко всем таблицам MySql, которые содержат данные клиентов. Жесткая часть меняет весь PHP-код, чтобы принять во внимание дополнительный параметр. Наша идея состоит в том, чтобы предварительно фильтровать данные по столбцу "владелец", чтобы все дальнейшие запросы на запрос всегда были и только выбирали данные относительно подключенного клиента. Таким образом, нам не нужно менять каждый запрос в нашем коде (имена таблиц в запросах уже параметризованы). Можно ли это сделать, используя временные таблицы? У нас есть собственный PHP-класс, который обрабатывает все запросы к базе данных и, как полагалось, должен был реплицировать данные подключенного клиента во временные таблицы каждый раз, когда объект класса создается. Запросы допроса будут автоматически перенаправляться в таблицы temp вместо исходных таблиц, в то время как операции вставки, обновления и удаления будут выполняться на оригинале. Является ли это приемлемым методом или мы столкнемся с трудностями? Конечно, проблема здесь. Любые другие предложения о том, как справиться с этим?
Дополнительная информация: Логин и аутентификация пользователей обрабатывается PHP, который устанавливает несколько переменных сеанса в отношении учетной записи. Учетные записи пользователей хранятся в таблице "пользователя" в той же базе данных, где хранятся данные, которые пользователь будет допрашивать/редактировать. Поэтому после входа у нас есть переменная $ _SESSION ['owner'], которая будет доступна по всему проекту и будет использоваться для идентификации записей, которые пользователь может видеть/редактировать.
Если вам нужно, чтобы пользователь входил в систему с использованием значения "пользователь", вы можете построить таблицу соединений с владельцем и пользователем (и мне нравится добавлять активный флаг только для s & g). Там действительно нет хорошего способа добавить временные таблицы или представления, потому что каждый "владелец" будет иметь представление. Есть своего рода решение. Вы можете создать представление на основе таблицы, которая присоединяется к таблице "владелец" пользователя(). Например, если у меня есть таблица с именем usertemp (пользователь varchar (40), владелец varchar (45)), а мое имя пользователя - "biff" (и оно существует в таблице), я могу создать представление:
create view usertemp_v
as
select user, owner
from usertemp
where user=user();
Затем я могу запросить представление:
select *
from usertemp_v;
Все, что я увижу, это данные, с которыми связано мое имя. Однако имейте в виду, что для этого требуется, чтобы вы либо задали переменную для пользователя, либо что у пользователей есть отдельные логины для MySQL. Он также требует, чтобы разрешения (IP-адрес или домен) также присутствовали в таблице owner_users (при использовании пользователя()).
Затем я должен присоединиться к вашим основным исходным таблицам для владельца, к которому я присоединяюсь в usertemp.
SELECT * FROM (SELECT * FROM org_tbl WHERE owner = 'aa') as tbl
, хотя производительность запросов будет сильно падать. Примите, что вы должны переписать все запросы. (И помечайте исправленные, чтобы не добавлять подзапрос фильтра)