могут ли отношения «многие ко многим» иметь отношения «многие ко многим» с другой таблицей? - PullRequest
0 голосов
/ 26 июня 2019

Рассмотрим этот случай, пользователь может иметь много групп, группы могут иметь много пользователей

только люди, принадлежащие к определенной группе, могут иметь доступ к машине, принадлежащей к этой группе

Так что я не уверен, как будут выглядеть таблицы

ниже приведены таблицы

-- Creating a new User
INSERT INTO Users (UserLogin, UserPassword, UserName)
VALUES ('SomeUser', 'SecretPassword', 'UserName');

-- Creating a new Groups
INSERT INTO Groups (GroupName, GroupDescription)
VALUES ('GroupName', 'GroupDescription');

-- Finally, updating the junction
INSERT INTO UserGroup (UserId, GroupId)
VALUES ('UserId', 'GroupId');

рассмотрим еще одну таблицу машин

INSERT INTO Cars (Name, Model)
VALUES ('SomeCar', 'Model');

только те люди, которые принадлежат к группе, могут иметь доступ к автомобилямS

Так должны ли автомобили иметь много-много отношений с группами пользователей?

INSERT INTO CarUserGroup (UserGroupId, CarId)
VALUES ('UserGroupId', 'CarId');

ИЛИ Должна ли группа иметь отношения один-ко-многим с автомобилями?

INSERT INTO Cars (Name, Model, GroupId)
VALUES ('GroupId','SomeCar', 'Model');

Можете ли вы сказать, какой подход лучше?

спасибо

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

С тех пор,

только люди, принадлежащие к определенной группе, могут иметь доступ к автомобилю, принадлежащему к этой группе

Поэтому вы должны создать One-to-Manyотношения между группами и автомобилями.Теперь, почему это должно быть сделано?Интуиция заключается в том, что пользователь может иметь автомобиль только в том случае, если он принадлежит к определенной группе, поэтому зависимость автомобилей зависит от группы.Но так как автомобиль является составным атрибутом групповой таблицы, вы создаете его таблицу связей с отношением один ко многим.Другое дело, что при удалении группы все автомобили, связанные с этой группой, также должны быть удалены (это необязательно, вы также можете иметь нулевой внешний ключ, в этом случае это будет ребенок-сирота, если вы не хотите удалять эти записисо стола машин).

0 голосов
/ 26 июня 2019

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

Cars (Name, Model, GroupId)

Однако такой подход становится нежелательным, как только автомобиль может быть связан более чем с одной группой. Причина в том, что тогда мы будем дублировать метаданные автомобиля:

SomeCar, SomeModel, Group1
SomeCar, SomeModel, Group2

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

SomeCar, Group1
SomeCar, Group2

Затем, пусть существует таблица Cars для хранения метаданных для каждого автомобиля, причем один автомобиль занимает только одну запись:

SomeCar, SomeModel, SomeOtherMetadata
...