Должен ли я хранить родителя и ребенка подряд или только ребенка - PullRequest
1 голос
/ 09 октября 2010

Допустим, я создаю приложение по аренде автомобилей, и в какой-то момент я должен показать все доступные автомобили.

В БД у меня есть следующие таблицы:

  • Марка
  • Модель
  • Автомобили

В модели есть FK для бренда, скажем, Brand_id

Итак, мой вопрос:

В таблице машин должны быть столбцы Марка и Модель? Или только столбец Модель, учитывая, что я могу получить Марку из столбца Модель?

Ответы [ 4 ]

3 голосов
/ 09 октября 2010

Базовая нормальная форма требует, чтобы таблица автомобилей НЕ включала столбец, который зависит от другого (не PK) столбца в таблице автомобилей.Поскольку марка зависит от модели, ее не должно быть в таблице автомобилей.

Проще говоря, вы храните огромное количество избыточной информации, если повторяете марку для каждого автомобиля.Вы можете легко получить доступ к этой информации, присоединив таблицу модели к запросу.И что произойдет, если у вас есть ряды «автомобилей», которые утверждают, что модель принадлежит одной марке, а другие утверждают, что она принадлежит другой?Это не только неправильно, в реальном мире это невозможно, и поэтому это не должно быть возможно в вашей базе данных.

1 голос
/ 09 октября 2010

В таблице автомобилей должен быть только ключ к модели. У вас никогда не было бы Ford Corvette или Chevrolet Mustang, и у вас не было бы одного и того же автомобиля, сделанного мной более чем одним производителем.

Если вам также нужен бренд, вы должны объединить все три стола на model.id = cars.model и model.brand = brand.id.

0 голосов
/ 09 октября 2010

Это зависит, я думаю. Если вы запрашиваете марку автомобиля из таблицы ваших автомобилей A LOT, и я имею в виду A LOT , (это означает, что вы хотите узнать марку автомобиля, не зная модель, поэтому вы присоединяетесь к таблицам автомобилей и марок, не используя модель ) вы можете подумать о добавлении brandid в свою таблицу машин, чтобы присоединиться к таблицам Cars и Brand без использования таблицы Model.
Если у вас так много записей в вашей таблице автомобилей (опять же, я имею в виду Soo Many), (и я сомневаюсь в этом), вы можете рассмотреть вопрос об уменьшении размера таблицы путем удаления brandid и просто использовать Model table для доступа к брендам.
Но это не единственный случай. Если вы храните brandid в своей таблице автомобилей, вы не будете соблюдать основные правила нормализации базы данных. То, что я упомянул, влияет на производительность, когда в таблицах более 10000 строк. Так что я уверен, что у вас все в порядке в обоих подходах.
Я бы определил только модельный FK в моей таблице автомобилей, так как нет необходимости иметь brandid, когда у вас есть modelid, и вы не беспокоитесь о производительности.

0 голосов
/ 09 октября 2010

Это должно иметь обе ссылки FK, по моему мнению.В зависимости от взаимосвязей этих таблиц вы также хотели бы избежать возможной ловушки фанатов.

Например,
A --- (1: N) --- B --- (1: N) --- C

Другой пример:
A - это любое измерение (например, ДАТЫ)
B - таблица с информацией о доставке и данными на уровне пакета
C - подробная таблица с информацией об уровне элементов пакета

Имеет смысл?

...