Я работаю над созданием схемы базы данных для следующих требований: Сотрудники имеют определенные атрибуты. Эти же атрибуты находятся на рабочих местах. Что мне нужно, так это поиск сотрудников на основе атрибутов заданного задания. Например, «Найдите всех сотрудников, которые соответствуют заданию id = 1 и имеют для него одинаковые атрибуты». (вице-Versa для поиска всех заданий для данного сотрудника). Вот моя схема базы данных.Дизайн базы данных для следующего сценария
Job (
jobId,
description
)
Employee(
employeeId,
firstName,
lastName,
startDate,
email
)
Attribute(
attributeId,
description
)
JobAttribute(
jobId, (FK to Jobs.jobId)
attributeId (FK to Attributes.attributeId)
)
EmployeeAttribute(
employeeId, (FK to Employees.employeeId)
attributeId (FK to Attributes.attributeId).
)
Запрос «Найти всех сотрудников, которые соответствуют заданию id = 1 и имеют для него одинаковые атрибуты». будет выглядеть так:
SELECT DiSTINCT e.employeeId
FROM Employee e
INNER JOIN EmployeeAttribute ea
ON e.attributeId = ea.AttributeId
and e.employeeId = ea.employeeId
WHERE ea.AttributeId In (
Select ja.attributeId
FROM Job j
inner join JobAttribute ja
on j.jobId = ja.jobId
inner join AttributeTable at
on ja.attributeId = at.attributeId
where jobId = 1
)
order by e.startDate asc
Запрос будет возвращать всех сотрудников, имеющих по крайней мере один атрибут, как и задание.
Как будет выглядеть запрос, если мне нужно вернуть всех сотрудников, у которых есть ВСЕ атрибуты, назначенные им в соответствии с заданиями, используя эту схему?
Это хороший дизайн для выполнения запросов. Я также хочу сделать это максимально гибким, чтобы добавлять новые атрибуты с минимальным изменением кода.
Имена таблиц должны быть единственными; Таблица Employee содержит 0 или более кортежей. – duffymo
@duffymo, что является чисто вопросом предпочтения. Я бы не согласился. Таблица предназначена для сбора кортежей. Таким образом, коллекция (имя таблицы) будет множественной, но имена столбцов будут единственными. При этом я не совсем понимаю ваш комментарий, потому что опубликованные имена являются единственными. –
Что вы здесь называете EAV (значение атрибута сущности). Есть много людей, которые считают, что этот тип рисунка является самым злым. Я думаю, что эта модель имеет свое место и весьма полезна в правильной ситуации. Одним из недостатков этого типа шаблона является повторное присоединение к таблицам атрибутов для получения всех значений. –