2014-09-15 9 views
0

Я работаю над созданием схемы базы данных для следующих требований: Сотрудники имеют определенные атрибуты. Эти же атрибуты находятся на рабочих местах. Что мне нужно, так это поиск сотрудников на основе атрибутов заданного задания. Например, «Найдите всех сотрудников, которые соответствуют заданию 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 

Запрос будет возвращать всех сотрудников, имеющих по крайней мере один атрибут, как и задание.

Как будет выглядеть запрос, если мне нужно вернуть всех сотрудников, у которых есть ВСЕ атрибуты, назначенные им в соответствии с заданиями, используя эту схему?

Это хороший дизайн для выполнения запросов. Я также хочу сделать это максимально гибким, чтобы добавлять новые атрибуты с минимальным изменением кода.

+0

Имена таблиц должны быть единственными; Таблица Employee содержит 0 или более кортежей. – duffymo

+0

@duffymo, что является чисто вопросом предпочтения. Я бы не согласился. Таблица предназначена для сбора кортежей. Таким образом, коллекция (имя таблицы) будет множественной, но имена столбцов будут единственными. При этом я не совсем понимаю ваш комментарий, потому что опубликованные имена являются единственными. –

+0

Что вы здесь называете EAV (значение атрибута сущности). Есть много людей, которые считают, что этот тип рисунка является самым злым. Я думаю, что эта модель имеет свое место и весьма полезна в правильной ситуации. Одним из недостатков этого типа шаблона является повторное присоединение к таблицам атрибутов для получения всех значений. –

ответ

1

Ok, ваш первый запрос, «Найди мне все сотрудники, которые спичка идентификатор задания = 1 и имеют те же атрибуты для него», может быть проще, как показано ниже

SELECT DISTINCT E.EmployeeId 
FROM 
Employee E 
INNER JOIN EmployeeAttribute EA ON (EA.EmpId = E.EmployeeId) 
INNER JOIN JobAttribute JA ON (EA.AttributeId = JA.AttributeId) 
WHERE AJ.JobId = 1 

по Вашему запросу по получению сотрудников, соответствующих всем атрибуты для данного задания

SELECT EA.EmployeeId, COUNT(EA.EmployeeId) 
FROM EmployeeAttribute EA 
INNER JOIN JobAttribute JA on EA.AttributeId = JA.AttributeId 
WHERE JA.JobId = @jobId 
GROUP BY EA.EmployeeId 
HAVING COUNT(EA.EmployeeId) >= (SELECT COUNT(AttributeId) FROM JobAttribute J where J.JobId = @jobId) 

Возможно, вам придется присоединиться к Мастеру работника, чтобы получить другую информацию о сотруднике. Оба запроса предполагают, что существует PK на производных таблицах, которая является комбинацией обоих FK.

С точки зрения производительности, используйте план выполнения запроса и соответственно определите свои индексы.