Отношение «ИЛИ» в реляционных базах данных - PullRequest
1 голос
/ 02 октября 2011

Вопрос довольно тривиальный, я думаю. НО ТЕМ НЕМЕНЕЕ, Например, у меня есть объекты: пользователь (идентификатор, имя), группа (идентификатор, имя), группа_пользователей (идентификатор_пользователя, идентификатор_группы) и галерея (идентификатор, имя, идентификатор_пользователя) Владелец галереи может быть пользователь ИЛИ группа .

Каково лучшее решение для этого в реляционных базах данных?

Спасибо!

PS Если кто-нибудь знает реляционную алгебру и оптимизацию схемы. Как это будет выглядеть?

Я думал о Владельце (id, user_id, group_id), но я понятия не имею, как показать отношение «ИЛИ» в терминах реляционной алгебры.

Ответы [ 4 ]

1 голос
/ 02 октября 2011

Самым простым решением было бы отношение Owner(id, user_id, group_id), где можно установить user_id или group_id - защитить это с соответствующим ограничением.

Объединение Group и User в одну таблицу приводит к нескольким проверкам согласованности из базы данных в логике приложения:

  • В группе могут быть не только пользователи, но и другие группы (рекурсия и / или бесконечные циклы впереди).
  • Если User и Group используются в некоторых других местах, может потребоваться дополнительная адаптация.
  • Согласованность данных больше не может быть обеспечена базой данных.
0 голосов
/ 02 октября 2011

Ввести нового лица ВЛАДЕЛЕЦ и сделать его владельцем ГРУППЫ.Затем сделайте категории USER и GROUP (т.е. «наследуйте» их) от OWNER.

Ваша модель ER будет выглядеть так (показаны только поля PK):

enter image description here

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

  1. Используйте отдельные таблицы для OWNER, USER и GROUP и соедините их черезИНОСТРАННЫЕ КЛЮЧИ.
    • В этом сценарии вы можете или не можете использовать дискриминатор (то есть идентификатор типа) в OWNER.
  2. Поместите USER и GROUP в отдельные таблицы с полями OWNERприсутствует в обоих.
  3. Поместите ВЛАДЕЛЬЦА, ПОЛЬЗОВАТЕЛЯ и ГРУППУ в одну таблицу.
0 голосов
/ 02 октября 2011

Технической разницы между пользователем и группой нет (только концептуальная).

Поместите их в одну таблицу (user) и отметьте тип строки (группа или пользователь) во втором поле.

Используйте логику приложения, чтобы убедиться, что только строка типа group может «иметь детей» в таблице user_group.

0 голосов
/ 02 октября 2011

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

...