2015-05-06 2 views
1

В принципе, у меня будет 3 таблицы, которые имеют отношение. Это: users, departments и company.Как структурировать эту реляционную базу данных

Проблема у меня есть это:

  • company может иметь много отделов
  • department может быть присоединен только к один компании
  • user может быть только частью один компания
  • A user может быть частью из многих отделов

Это, по существу, что таблица соотношение будет выглядеть следующим образом:

    ____________________ 
        | | | |   | 
        | | | |   | 
--------  --------------  ----------- 
| user |  | department |  | company | 
--------  --------------  ----------- 
| |   | | | | |    | 
| |   | | | | |    | 
| ___________________    | 
|          | 
|          | 
|          | 
_______________________________________ 

Вышеупомянутый кратному | линии показывают вариант, так что «компания» выше, имеет 4 отделения и скоро.

Теперь мой вопрос в том, как мне структурировать таблицы отношений?

Должен ли я иметь user_departments, user_company и company_departments столы?

Это было по существу выглядеть следующим образом:

-------------------- 
| user_departments | 
-------------------------------- 
| id | user_id | department_id | 
-------------------------------- 

---------------- 
| user_company | 
----------------------------- 
| id | user_id | company_id | 
----------------------------- 

----------------------- 
| company_departments | 
----------------------------------- 
| id | company_id | department_id | 
----------------------------------- 

Или есть какие-либо другие альтернативы для меня, чтобы рассмотреть/внедрить вместо пути я иду, как это кажется, что это просто будет держать растущий комплекс?

+0

Есть ли необходимость в отношениях между пользователем и компанией, если другие остаются? – KingOfAllTrades

+0

@KingOfAllTrades Мне нужно знать, какая компания является пользователем, как правило, поскольку отдел не является постоянным, его можно просто удалить, если это необходимо – Darren

+1

Из описания есть только * один * ** много-ко-многим ** отношений между 'user' и' department'. Другие ** отношения «один ко многим» ** могут быть реализованы путем добавления столбца внешнего ключа к таблице сущностей, например. добавьте столбец 'company_id' в таблицу' user' и таблицу 'department'. (Из трех таблиц, которые вы показываете, вам нужна только таблица 'user_department', вам не нужны два других.) – spencer7593

ответ

3

Вы по существу делаете избыточные отношения. У вас не должно быть необходимости в company_departments, company_id будет просто полем таблицы отделов для ссылки на компанию, частью которой является отдел. Аналогично, вам не понадобится таблица user_company, но вам понадобится user_departments one; это связано с тем, что отношения между пользователем и отделом фактически являются «многими ко многим».

С примером, который вы указали, нужны только четыре таблицы.

company: company_id, other company info (such as name) 
department: department_id, company_id (referencing the company record), other department info 
user: user_id, company_id (referencing the company record), other user info 
user_departments: user_id, department_id, perhaps information such as user's role in department, or if you want historical data preserved dates assigned to and removed from department 
+0

Компания может удалить отделы, и если пользователь только член отдела, который удаляется, как я узнаю, с какой компанией они связаны? – Darren

+0

@Darren, Как и таблица отделов, таблица пользователя должна иметь company_id. – Uueerdo

2

Вот макет в формате, который вы использовали:

--------- 
| users | 
-------------------------------- 
| id | name | company_id | ... | 
-------------------------------- 

----------- 
| company | 
------------------- 
| id | name | ... | 
------------------- 

----------- 
| departments | 
-------------------------------- 
| id | name | company_id | ... | 
-------------------------------- 

-------------------- 
| user_departments | 
-------------------------------- 
| id | user_id | department_id | 
-------------------------------- 
+0

В таблице 'department' также должен быть столбец внешнего ключа' company_id', ссылающийся на 'company (id)'. – spencer7593

+0

Спасибо. обновлено. – KingOfAllTrades

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