Отношение базы данных 1: 1 против 1: 0..1 - PullRequest
2 голосов
/ 20 января 2011

Я пытаюсь выучить эти отношения. Это правильно, как я покажу ниже, что:

1) У меня будет отношение 1: 0..1 , просто сделав ключ идентификации родителя также ключом идентификации ребенка?

2) Чтобы сделать это 1: 1 , я добавляю FK в родительскую таблицу, соединяя два столбца Identity?

Это все, что нужно? И, пожалуйста, поправьте меня, если моя формулировка не является точной / правильной.

1:0..1

Клиент (Id {PK, Identity}, Name)

CustomerAddress (CustomerId {PK, FK, Identity}, StreetName)

FK_CustomerAddress_Customer (CustomerId, Id)

1:1

Клиент (Id {PK, FK, Identity}, Name)

FK_Customer_CustomerAddress (Id, CustomerId)

CustomerAddress (CustomerId {PK, FK, Identity}, название улицы)

FK_CustomerAddress_Costumer (CustomerId, Id)


EDIT1:

Я полагаю, что оба вышеперечисленных были неправильными, и решение выглядит так: (?)

1:0..1

Клиент (Id {PK, Identity} , Имя)

CustomerAddress (CustomerId {PK, FK, UNIQUE} , StreetName)

FK_CustomerAddress_Customer (CustomerId, Id)

Ответы [ 3 ]

4 голосов
/ 20 января 2011

Соотношение 1: 1 между двумя таблицами означает, что каждый кортеж в каждой таблице соответствует ровно одному кортежу в другой.Это более формально известно как Биекция.Это ограничение SQL, которое для большинства практических целей практически невозможно достичь биекции в базе данных SQL.Это связано с тем, что для SQL требуется, чтобы каждая таблица обновлялась индивидуально, и поэтому невозможно обновить две такие таблицы, если вы временно не отключите одно из ограничений.

Отношение 1: 0/1 также называется Surjection (ваш первый пример).Surjection - это стандартное поведение ограничения «FOREIGN KEY» в стиле SQL, предполагающего недопустимые значения NULL.Ограничение всегда является необязательным с одной стороны отношения.

ПРИМЕЧАНИЕ. Свойство IDENTITY не относится к вашему примеру.Это ключ и ограничения внешнего ключа, которые определяют отношения.

3 голосов
/ 20 января 2011

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

Таким образом, решение, которое вы перечисляете для 1: 0,1, обычно используется в обоих случаях. Насколько я знаю, SQL Server не предлагает способа превзойти второй 1 в ограничении 1: 1.

0 голосов
/ 20 января 2011

Интересное прочтение на эту тему:

О ПОФН * И ПУДЕ * - ДВА ПРИНЦИПА ДИЗАЙНА БАЗ ДАННЫХ КОМПЛЕКСНЫХ БАЗ ДАННЫХ с Фабианом Паскалем, Хью Дарвеном и Дэвидом Макговераном

Я всегда учу, что потеря этого ограничения [круговые ФК] является еще одним преимуществом нормализации, а не проблемой с ним!

...