Присоединение к другой таблице с существующей таблицей соединений

#mysql #orm #relational-database #typeorm

#mysql #orm #реляционная база данных #typeorm

Вопрос:

Я довольно новичок в проектировании баз данных и мог бы использовать некоторые рекомендации по проекту, над которым я работаю.

У меня есть три существующие таблицы accounts , users , и таблица соединений, представляющая вызываемое отношение «многие ко многим accounts_users » .

Как вы можете догадаться, accounts_users таблица выглядит следующим образом:

 | accountId | userId |
| --------- | ------ |
| 1         | 1      |
| 1         | 2      |
| 2         | 1      |
 

Мне нужно добавить роли для пользователей, где пользователь может иметь отдельную роль для каждой учетной записи, к которой он принадлежит.

Я создал таблицу ролей (содержащую id и name ), но ищу указания относительно того, каким будет следующий шаг, чтобы создать связь между таблицами roles и accounts_users .

Должен ли быть добавлен дополнительный столбец в accounts_users таблице, содержащий roleId или должна быть добавлена другая таблица соединений?

Спасибо!

Комментарии:

1. Я бы добавил столбцы ролей в таблицу соединений с внешним ключом к таблице ролей, которая содержит данные об обогащении ролей (например, описание). Вы также можете подумать, истекает ли время ролей (например, временная доверенность)

Ответ №1:

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

  • Если с каждой парой учетная запись-пользователь связана своя уникальная роль (соотношение 1: 1), вы можете создать name столбец непосредственно в accounts_users таблице.
  • Если одна единственная роль разделяется между несколькими парами учетная запись-пользователь (отношение 1: N), вы должны использовать отдельную roles таблицу и соединить таблицы, добавив roleId внешний ключ в accounts_users таблицу (так же, как вы написали сами).

Второе решение также подходит, когда объект роли содержит большой объем информации (не только несколько столбцов name ), поэтому нежелательно портить таблицу соединений несвязанными и, возможно, ненужными данными.

Комментарии:

1. Второй пункт — это то, что я имел в виду, поэтому я пойду по этому пути. Большое вам спасибо!