отношения в Sql - PullRequest
       22

отношения в Sql

3 голосов
/ 07 августа 2009

Я знаю, как создать отношения один ко многим, многие ко многим в SQL Server, но возможно ли создать отношение один к одному? И возможно ли создать отношения от 1 до 0 или 1?

Ответы [ 5 ]

3 голосов
/ 07 августа 2009

Да, просто поместите PRIMARY KEY s обоих объектов в таблицу ссылок, определив ключ UNIQUE для обоих объектов:

myrel(entityA, entityB, UNIQUE(entityA), UNIQUE(entityB))

Таким образом, если entityA = 1 относится к entityB = 2:

entityA  entityB
      1        2

, вы не можете связать ни entityA = 1 с любым другим entityB, ни entityB = 2 с любым другим entityA.

Если ваше отношение симметрично (то есть entityA и entityB принадлежат одному домену и относятся entityA к entityB, также означает относительное entityB к entityA), тогда определите дополнительная CHECK постоянная:

entityA  entityB

UNIQUE(entityA)
UNIQUE(entityB)
CHECK(entityA < entityB)

и преобразовать нормализованное отношение в каноническое с помощью этого запроса:

SELECT entityA, entityB
FROM   myrel
UNION
SELECT entityB, entityA
FROM   myrel

Это отношение (0-1):(0-1).

Если вы хотите, чтобы это было отношение 1:1, определите эту таблицу как домен для entityA и entityB:

myrel(entityA, entityB, UNIQUE(entityA), UNIQUE(entityB))
A(id, PRIMARY KEY(id), FOREIGN KEY(id) REFERENCES myrel (entityA))
B(id, PRIMARY KEY(id), FOREIGN KEY(id) REFERENCES myrel (entityB))

Удаляя FOREIGN KEY из определения любой таблицы, вы изменяете соответствующую часть отношения с 1 на (0-1).

1 голос
/ 07 августа 2009

Два способа: 1) отношение пк-пк 1: 1. Таблицы A и B имеют оба PK. Создайте FK от B PK до PK A. Это делает 'B' стороной FK отношения 1: 1

или

2) отношение FK / UC-PK 1: 1. Таблица A имеет PK, а таблица B имеет внешний ключ для A, но FK в B не находится на PK of B. Теперь создайте UC на полях FK в B.

0 голосов
/ 07 августа 2009

Это весело, но это мои любимые вопросы на собеседовании.

Итак, у вас есть таблица A, B, соответствующая каждому из них, имеет первичный ключ A_ID, B_ID. Добавьте внешний ключ к любому. Пусть это будет B: A_REF, поэтому вам просто нужно добавить уникальное ограничение на A_REF.

0 голосов
/ 07 августа 2009

Да

TableA id PK

TableB id PK FK TableA

0 голосов
/ 07 августа 2009

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

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