Другой Много-Много Сценарий - PullRequest
1 голос
/ 09 апреля 2009

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

system_id - это PK в системной таблице, а user_id - это PK в пользовательской таблице. Я связал их с system_id как FK в пользовательской таблице. Я не могу понять таблицу между ними. У меня была идея создать таблицу system_user и использовать там оба внешних ключа, но я не могу понять, как это будет работать.

Ответы [ 4 ]

3 голосов
/ 09 апреля 2009

Вы направляетесь в правильном направлении.

Создать таблицу "system_user":

CREATE TABLE system_user (system_id INT NOT NULL, user_id INT NOT NULL);

Это не совсем сущность в смысле строгого реляционного моделирования, поэтому для нее не требуется первичный ключ. Однако вы можете добавить его, если этого требуют ваши сценарии.

Чтобы получить всех пользователей в системе, вы должны сделать запрос следующим образом:

SELECT u.* FROM user u, system_user su WHERE su.system_id = ?

Чтобы получить доступ ко всем системам, к которым может обратиться пользователь, вы должны сделать запрос:

SELECT s.* FROM system s, system_user su WHERE u.user_id = ?

Надеюсь, это поможет!

3 голосов
/ 09 апреля 2009

Вы правильно поняли. Используйте таблицу сопоставления для многих отношений. Вам не понадобятся никакие столбцы внешнего ключа в ваших таблицах систем или пользователей. Ваша таблица сопоставления будет иметь что-то вроде MappingID PK, SystemID и UserID. Вы также можете сделать всю строку PK, но это не нужно (если вы не хотите использовать MappingID). Затем просто вставьте пары в эту таблицу, которые связывают систему с пользователем. Вы можете выбрать SystemID или UserID, чтобы получить все отношения, которые имеет определенная сущность. Вы также можете включить любые метаданные, которые может иметь сопоставление, например, дату установления ассоциации.

2 голосов
/ 09 апреля 2009
System            System_User        User        
------            -----------        ----
 *system_id  --->  *system_id             
  data             *user_id    <---   *user_id
                                       data

*    denotes the primary key columns
---> denotes a PK/FK relationship
1 голос
/ 09 апреля 2009

Вы на правильном пути. Ваша новая таблица system_user будет как минимум иметь 3 столбца:

  • systemuser_id - первичный ключ
  • user_id - внешний ключ к таблице пользователя
  • system_id - внешний ключ к системной таблице
...