2013-12-10 4 views
0

Предположим, у меня есть сотрудник & Столы для совещаний.Дизайн БД Многие из многих отношений с другими таблицами

Employee 
----------- 
id 
name 


Meeting 
----------- 
id 
name 


Employee_Meeting 
----------- 
id 
employee_id 
meeting_id 

Теперь мне нужно добавить задачи сотрудника (или что-то еще) на эту встречу. Что такое наилучшая практика? Я мог бы иметь отношения, как это:

Employee_Meeting_Task 
----------- 
Employee_Meeting_id 
task_id 

или

Employee_Tasks 
----------- 
id 
employee_id 
meeting_id 
task_id 

ли обе эти подходы действительно с «правильной» базы данных точки зрения дизайна?

Мои проблемы являются:

Случай 1: Большую часть времени, если удалить сотрудника из собрания мне нужно удалить свои задачи в этой встрече, а также. Employee_Meeting_Task будет принуждаться к ограничению.

Случай 2: Иногда сотрудник участвует в ежедневной встрече и регулярно выполняет те же задачи на этом собрании. Если он заболел в течение нескольких дней, я хотел бы удалить его из собрания, но я не хочу снова добавлять его задачи на собрание в следующий раз, когда он его примет.

+0

Поскольку у сотрудника может быть более одной задачи на собрании, я бы сказал, что наличие таблицы Employee_Meeting_Task имеет наибольший смысл. Если это было от 1 до 1 отображения, таблица будет чувствовать себя избыточной, хотя. – Tobberoth

+1

Прочтите http://stackoverflow.com/questions/2190272/sql-many-to-many-table-primary-key для первичных ключей для таблиц многих-ко-многим. –

ответ

1

Есть несколько вещей, на которые вы должны обратить внимание. Во-первых, если у сотрудника может быть задание, не связанное с собранием, у вас могут быть проблемы. Один из способов - записать запись в таблице собраний с именем «неприменимо». Другой способ - вывести поле meeting_id из таблицы employee_tasks. Лучший способ зависит от требования связать задачи с собраниями, о чем вам нужно спросить своего специалиста.

Далее, для многих-многих таблиц вам не нужно отдельное поле id. Например, для employee_meeting PK может быть employee_id и meeting_id.

Далее, посмотрите, что вы сказали для случая 2. Если есть ежедневная встреча, то это не будет одна запись в вашем столе собрания за каждый день?

+0

Для простоты предположим, что все собрания проводятся ежедневно и имеют одну запись на собрание в базе данных совещаний. У меня есть сомнение в том, как правильно создавать таблицы, когда иногда вы хотите удалить запись из таблицы «многие из многих» со всеми связанными данными, а иногда вы хотите временно удалить отображение, но сохранить связанные данные. Я использую Meeting/Employee как пример. Теперь я думаю, что я мог бы добавить «is_active» в таблице employee_meeting, чтобы узнать, был ли временно удален сотрудник, и использовать Employee_Meeting_Task для задания задач. Лучше ли использовать внешний ключ для 2 столбцов, а не для одного? – jonasnas

+0

Думаю, вам лучше начать и прекратить даты в таблице employee_meeting. Это позволяет сохранить историю. –

Смежные вопросы