2009-08-07 51 views
3

我知道如何在SQL Server中創建一對多,多對多的關係,但可以創建一對一的關係嗎?是否有可能創建1到0或1的關係?Sql中的關係

回答

3

是的,只是把PRIMARY KEY小號兩個實體的成鏈接表,在兩個實體定義UNIQUE鍵:

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

因此,如果entityA = 1有關entityB = 2

entityA entityB 
     1  2 

,您可以將entityA = 1與任何其他entityB都不相關,也不會將entityB = 2與任何其他entityA相關聯。

如果關係是對稱(即entityAentityB屬於相同的域和與entityAentityB也指與entityBentityA),則定義一個額外CHECK constrant:

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關係,定義這個表是兩個entityAentityB域:

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)

+0

1到0或1的關係呢? – 2009-08-07 16:27:46

0

是的,只需將從屬表中的主鍵或備用鍵作爲父表中的主鍵的外鍵即可。

+0

1到0或1的關係? – 2009-08-07 16:31:13

+0

我所描述的是一個1比0或1的關係。在子表中,父表中的每一行都不必有記錄... – 2009-08-07 18:11:59

0

表A ID PK

表B ID PK FK表A

+0

修改如何?例如房間與經理有1:1關係,有些經理被解僱了,如何更新? – Dewfy 2009-08-07 16:28:18

+0

您還忘記了唯一的約束 – Dewfy 2009-08-07 16:29:09

+0

要管理它,您需要級聯數據庫級別或數據訪問層級別。 – Ray 2009-08-07 16:57:52

0

這很有趣,但在接受採訪是我不喜歡的問題。

所以你有表A,B對應的每一個都有主鍵A_ID,B_ID。將外鍵添加到任何。讓它成爲B:A_REF,所以你只需要在A_REF上添加唯一約束。

+0

+1,因爲你是對的,但你能更詳細地解釋一下嗎? – edebill 2009-08-07 16:29:42

+0

1比0或1的關係? – 2009-08-07 16:32:22

+0

表A ID是PK(自動使其唯一)並且是表B ID的FK,它也是PK(自動使其唯一)。 – Ray 2009-08-07 17:00:25

1

兩種方式: 1)pk-pk 1:1關係。表A和B都有PK。 1關係

2)的FK/UC-PK 1:1:1的關係,從B到PK A的PK這使得 'B' 的1的FK側創建FK。表A有一個PK,而表B有一個到A的外鍵,但B中的FK不在B的PK上。現在在B的FK字段中創建一個UC。

+0

1到0或1的關係? – 2009-08-07 16:33:33

+0

在方法1中,如何向A和B中插入新條目?方法2最終不是「1比0或1」關係嗎? – 2009-08-07 16:53:00

+0

@ArsenMkrt:使FK可以爲空。 @Jonathan:方法1很容易插入。由於B依賴於A,所以首先在A中插入行,然後在B中插入行.A不指向B,B只指向A.方法2不是1..0..1的關係,if你讓FK不能爲空,如果FK邊是可選的,它只會被選中。 – 2009-08-09 08:07:06