Вам, вероятно, было бы намного лучше нормализовать администраторов, пользователей, менеджеров и все, что у вас есть в одну унифицированную таблицу со столбцом дискриминатора «Роль», что позволило бы сэкономить большое количество дубликатов, что по сути является причиной для нормализации на первом месте. Затем можно добавить подробные сведения о роли в отдельные таблицы, которые вы используете с таблицей User в объединении.
Ваш запрос может выглядеть так просто:
SELECT
`Name`, `Surname`, `Email`, `Phone`, `Role`
FROM `User`
WHERE
`User`.`Role` IN('Administrator','Manager','Customer', ...)
Что также проще для базы данных обрабатывать, чем набор union
s
Если вы сделаете еще один шаг, вы можете добавить таблицу UserRoleCoupling
(вместо столбца Role
в User
), которая содержит все роли, которые пользователь имеет для пользователя:
CREATE TABLE `UserRoleCoupling` (
UserID INT NOT NULL, -- assuming your User table has and ID column of INT
RoleID INT NOT NULL,
PRIMARY KEY(UserID, RoleID)
);
И поместите фактическую информацию о роли в отдельную таблицу:
CREATE TABLE `Role` (
ID INT NOT NULL UNIQUE AUTO_INCREMENT,
Name VARCHAR(64) NOT NULL
PRIMARY KEY (Name)
)
Теперь вы можете иметь несколько ролей на пользователя и использовать такие запросы, как
SELECT
`U`.`Name`
,`U`.`Surname`
,`U`.`Email`
,`U`.`Phone`
,GROUP_CONCAT(`R`.`Name`) `Roles`
FROM `User`
INNER JOIN `UserGroupCoupling` `UGC` ON `UGC`.`UserID` = `User`.`ID`
INNER JOIN `Role` `R` ON `R`.`ID` = `UGC`.`RoleID`
GROUP BY
`U`.`Name`, `U`.`Surname`, `U`.`Email`, `U`.`Phone`
Что даст вам основные User
данные и разделенный запятыми список всех назначенных Role
имен.
В общем, лучший способ нормализовать структуру базы данных - сделать таблицы как можно более общими, не создавая избыточности, поэтому не добавляйте подробные данные администратора или клиента в пользовательскую таблицу, а используйте соотношение между User
и Administrator
, чтобы найти конкретные данные администратора. То, как вы делаете это сейчас, не очень нормализовано.
Я посмотрю, смогу ли я найти свою любимую книгу по нормализации базы данных и опубликую ISBN, когда у меня будет время.