2016-06-09 4 views
0

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

У меня есть 3 стола. Между Милкшаком и Лицом существует одно-много отношений (у одного человека много молочных коктейлей). Существует также одно-много взаимоотношений между персонажем и услугами коронарного уха (один человек может много раз обращаться за коронарной заботой.

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

ответ

1

Фактически, если вы следуете модели сущности-отношения строго так, как первоначально описанный Питером Ченом, у вас будет 5 таблиц - 3 отношения сущностей и 2 отношения отношений.

Many-to-one-to-many ER

Many-to-one-to-many tables

Существует переходные многие-ко-многим между Milkshake и Coronary Care через два один-ко-многим. В этом случае таблица Person не должна быть вовлечена - вы могли бы присоединиться Owns к Attends на ключе Person они имеют общие черты:

SELECT milkshake_id, coronary_care_id 
FROM Owns 
INNER JOIN Attends ON Owns.person_id = Attends.person_id 

Теперь, если вы денормализовать таблицы с тем же определителем, вы получаете 3 таблицы вы имели в виду в вашем вопросе:

Denormalized tables

в этом случае соотношение между Milkshake и Person записывается в Milkshake таблице, и отношения между Person и CoronaryCare записывается в таблице CoronaryCare. (Помните, что ограничения внешнего ключа не являются отношениями.)

Вы все еще можете получить много-ко-многим:

SELECT milkshake_id, coronary_care_id 
FROM Milkshake 
INNER JOIN CoronaryCare ON Milkshake.person_id = CoronaryCare.person_id 

Как вы можете видеть, Person таблицы не ссылка. Даже при денормализации у вас все еще есть два отношения «один ко многим», за исключением того, что они теперь записаны в таблицах Milkshake и CoronaryCare.

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

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