Установка:
Я пытался понять разницу между идентифицирующими и неидентифицирующими отношениями, когда нашел эту замечательную статью о stackexchange. В чем разница между идентифицирующими и неидентифицирующими отношениями?
Прочитав несколько комментариев, я вспомнил еще один вопрос о проблеме, с которой я столкнулся.
Вопрос:
Должен ли я использовать первичные ключи из нескольких столбцов в каждой дочерней таблице и каковы преимущества / недостатки для этого?
Чтобы лучше проиллюстрировать мой вопрос, я создал пример ниже. Я также включил комментарии, которые заставили меня задать этот вопрос.
Пример:
В моей ситуации я знаю building_id
, и мне нужно получить bed.data
.
# 1 - Моя текущая структура БД:
TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data }
floor { id, building_id, data }
room {id, floor_id, data }
bed {id, room_id, data }
Этот тип структуры таблицы потребовал бы от меня использования нескольких соединений для получения нужных мне данных. Ничего страшного, но отчасти боль, так как я часто сталкиваюсь с этой ситуацией.
# 2 - Моя интерпретация предложенной БД Карвином структуры БД (см. Комментарии к статье ниже):
TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data }
floor { id, building_id, data }
room {id, building_id, floor_id, data }
bed {id, building_id, floor_id, room_id, data }
Эта структура таблицы, кажется, устраняет необходимость объединений в моей ситуации. Итак, каковы недостатки этой структуры таблицы? Мне очень нравится идея не делать так много операторов объединения.
Комментарии от статьи:
В чем разница между идентифицирующими и неидентифицирующими отношениями?
@ hobodave: Это аргумент "соглашение о конфигурации". Некоторые школы считают, что каждая таблица должна определять свой первичный ключ для псевдоключа с одним столбцом с именем id, который автоматически генерирует ее значения. Фреймворки приложений, такие как Rails, сделали это популярным по умолчанию. Они рассматривают естественные ключи и ключи из нескольких столбцов как отличающиеся от их соглашений, необходимых при использовании «старых» баз данных. Многие другие рамки последовали этому примеру. - Билл Карвин 10 марта 2010 года в 23: 06
Похоже, что "правильное" построение идентифицирующих отношений приведет к неприятно огромным первичным ключам. например Здание имеет Этаж имеет Комната имеет Кровать. PK для кровати будет (bed_id, floor_id, room_id, building_id). Кажется странным, что я никогда не видел это на практике и не слышал, чтобы это предлагалось как способ что-либо сделать. Это много избыточных данных в ПК. - hobodave 10 марта 2010 года в 23: 34
@ hobodave: я видел многоколонные первичные ключи, которые еще больше. Но я понимаю вашу точку зрения. Учтите, что многоколонные первичные ключи передают больше информации; Вы можете запросить таблицу кроватей для всех кроватей в конкретном здании без каких-либо соединений. - Билл Карвин 11 марта 2010 года в 1: 00