Как структурировать эту реляционную базу данных
В основном у меня будет 3 таблицы, которые имеют отношение. Они есть: users
, departments
а также company
,
У меня есть проблема:
-
company
может иметь много отделов -
department
может быть присоединен только к одной компании -
user
может быть только частью одной компании -
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 |
-----------------------------------
Или есть ли другие альтернативы для меня, чтобы рассмотреть / реализовать вместо пути, по которому я иду, так как кажется, что он будет только усложняться?
2 ответа
По сути, вы создаете избыточные отношения. Вы не должны нуждаться в company_departments, когда company_id будет просто полем таблицы отделов, чтобы указать компанию, частью которой является отдел. Точно так же вам не понадобится таблица user_company, но вам понадобится таблица user_departments; это происходит из-за того, что отношения между отделом пользователя и на самом деле являются многими ко многим.
В приведенном вами примере вам нужно всего четыре таблицы.
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
Вот макет в формате, который вы использовали:
---------
| users |
--------------------------------
| id | name | company_id | ... |
--------------------------------
-----------
| company |
-------------------
| id | name | ... |
-------------------
-----------
| departments |
--------------------------------
| id | name | company_id | ... |
--------------------------------
--------------------
| user_departments |
--------------------------------
| id | user_id | department_id |
--------------------------------