Как структурировать эту реляционную базу данных

В основном у меня будет 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 |
--------------------------------
Другие вопросы по тегам