2017-02-19 15 views
0

У меня есть некоторые сомнения относительно отношений один к одному. В моем примере у меня есть одна компания, и у компании есть один адрес. (Тип данных случайным образом, только для иллюстрации)Отношения один к одному (1: 1)

Вариант 1:

Option 1

Вариант 2:

Option 2

Какой самый лучший вариант? Я могу поместить все данные в одну таблицу, я знаю, но много атрибутов для одной таблицы.

+4

Лучший вариант - тот, который отвечает вашим потребностям. По моему опыту, компания может иметь несколько адресов одновременно и с течением времени. –

+1

В варианте 1 вам потребуется сначала создать адрес, если address_id будет обязательным. Вариант 2 потребует противоположного, если требуется company_id. Или если вы добавляете ограничения и т. Д. – davejal

+1

Третий вариант: используйте таблицу соединений с столбцами '(company_id, address_id)' и уникальное ограничение для обоих столбцов. Таким образом, ваши таблицы компаний и адресов могут оставаться неизменными, и вы связываете их через третью таблицу. Единственное ограничение гарантирует, что есть только отношения 1: 1. – knittl

ответ

1

Я лично стараюсь избегать создания отношений один к одному. В вашем примере у вас есть одна компания, у которой есть связь с адресом. Я бы просто поместил внешний ключ на стол компании, который официально сделал бы это отношением один к многим (даже если вы никогда не будете его использовать). Итак, я бы сначала спросил, можете ли вы принять модель, где двум компаниям разрешено иметь один и тот же адрес.

Если нет, то возможное решение для отношений один к одному состоит в том, чтобы использовать то же значение, что и первичный ключ. Так что идентификатор 1000 в таблице компании соответствует ID 1000 в таблице адресов. Многие инструменты ORM, такие как EF и Hibernate, используют этот метод, нет хорошего родного SQL, поддерживающего его способ, не получая много проблем (каскадные удаления, чтобы упомянуть один).

0

Я согласен с Fredrik Rudberg. Если другая таблица не представляет собой независимый объект (это относится только к проблемному домену), не рекомендуется хранить отдельную таблицу для отношений один к одному. У вас есть таблица адресов (если она создана), способствующая любой другой коммерческой необходимости? Если бы не тогда, было бы неплохо показать адрес как атрибут (столбец) для компании (Company таблица)?

0

создать 1-1 отношения в 2 случаях:

  • зависимой таблицы (Address в вашем случае) может быть соединена с другими таблицами. Поэтому я сохраняю его как автономный объект.
  • Абстракция или специальный прецедент. например, всегда стараюсь, чтобы пользовательские данные & содержались в двух отдельных таблицах.

Имея это в виду, в то время как & ваша конструкция не позволяет первый случай произойдет (из Company_id колонки в нем), я буду толкать обе таблицы в одну. Не беспокойтесь о размере стола. Это не имеет большого значения в вашем случае.