2014-03-21 3 views
2

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

Автомобиль может не иметь спойлера или максимум одного спойлера.

Спойлер может быть установлен на полке или установлен на одном автомобиле.

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

Каков наилучший способ определить взаимосвязь между этими двумя таблицами?

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

CARS CarId CarDesc SpoilerId

SPOILERS SpoilerId SpoilerDesc CarId

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

Моя вторая мысль была просто внешний ключ для спойлеры в таблице АВТОМОБИЛЕЙ, и если я когда-нибудь понадобится, чтобы получить все спойлеры на полке, я могу просто запустить что-то похожее на SELECT * FROM SPOILERS WHERE SPOILER.SPOILDERID NOT IN (SELECT SPOILERID FROM CARS) Но разве не это означает, что Мне нужно было бы выполнять полное сканирование таблицы каждый раз, когда я хочу узнать, какие спойлеры находятся на полке? Может ли это повлиять на производительность, если я ожидаю сотни тысяч записей в каждой таблице?

Моя третья мысль была создать схождения таблицу:

CARS CarId CarDesc

CARS_SPOILERS SpoilerId CarId

SPOILERS SpoilerId SpoilerDesc

Но не это оставляет возможность определения нескольких спойлеры для автомобиля, или наоборот? Должен ли я установить CARS_SPOILERS.SpoilerId и CARS_SPOILERS.CarId, чтобы быть уникальным?

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

Благодаря

ответ

0

Рассмотрите возможность использования таблицы автомобилей со ссылкой спойлера (ID) в качестве внешнего ключа таблицы Spoiler описывающего спойлер (не ссылающийся автомобиль).

Вы можете найти неустановленные спойлеры с (выберите * от Spoiler где spoilerid не в (выберите spoilerid из автомобиля). Если есть проблемы с производительностью, вы можете индексировать spoilerid в автомобилях.

Простейшие.

0

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

Во-первых, вы можете обеспечения уникальности, просто требуя, чтобы как CarId и SpoilerId быть уникальным. Это довольно удобно, когда MySQL может принудительно использовать реляционный constr не прибегая к триггерам.

Основная причина, однако, является эстетической. Я пытаюсь представить ваш мир автомобилей и спойлеров и полки. И тогда я думаю: «Хм, может быть, есть более одной полки». А если есть, то какой спойлер он содержит? Разве я не хочу иметь таблицу Shelves_Spoilers, чтобы ответить на вопросы о полках и их спойлерах?

Эстетическая причина - это симметрия Shelves_Spoilers и Cars_Spoilers.

Смежные вопросы