2009-11-12 21 views
33

我需要定義一對一的關係,並且似乎無法在SQL Server中找到正確的方式。在SQL Server中定義一對一的關係

爲什麼要問你一對一的關係?

我使用WCF作爲DAL(Linq),我有一個包含BLOB列的表。 BLOB幾乎沒有變化,每次查詢時都會浪費帶寬。

我看了一下this solution,雖然看起來好像是一個好主意,但我可以看到Linq在試圖實現這種方法時有一點缺陷。

任何想法?

回答

76

一對一實際上經常用於超類型/子類型關係。在子表中,主鍵也充當父表的外鍵。這裏有一個例子:

org_model_00

CREATE TABLE Organization 
( 
    ID  int PRIMARY KEY, 
    Name  varchar(200), 
    Address varchar(200), 
    Phone varchar(12) 
) 
GO 

CREATE TABLE Customer 
( 
    ID    int PRIMARY KEY, 
    AccountManager varchar(100) 
) 
GO 

ALTER TABLE Customer 
    ADD FOREIGN KEY (ID) REFERENCES Organization(ID) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
GO 
+5

感謝上帝,在這裏有人知道SQL和關係數據庫。你已經證明這種關係是**明確的**。對於那些不確定關係是否爲1 :: 1的人,請注意,Customer.ID(也是Organisation.ID)是** unique **,因此只能有一個Customer行任何組織行。 – PerformanceDBA 2011-03-06 07:19:39

+30

@PerformanceDBA:關係爲'1:0..1',因爲它沒有約束來確保父表中的每一行都有一個匹配的行。對於發佈的模式,對於'Organization'中的每一行,Customer中可以有零個或一個行,因此'1:0..1'。 – onedaywhen 2011-03-10 14:36:00

+1

@oneday。謝謝,但你對錶面問題的解釋(顯而易見)與深層問題無關。你的評論的基礎,而不是評論本身,是不正確的。你和Adam有一樣的誤解(誰已經刪除了他的答案)。這個問題不能在評論中處理。如果您真的有興趣瞭解關係數據庫術語,請提出一個新問題,我會全面回答。我不會回覆進一步的評論。 – PerformanceDBA 2011-03-11 08:59:06

4

爲什麼不讓每個表的外鍵具有唯一性?

+0

所以,如果我有tableA = 3中的鍵和tableB = 4中的鍵,它們在它們的表中是唯一的,但沒有關係。 – JeffO 2009-11-12 17:08:01

+1

但是,如果tableA.id = 3且tableB.tableAId = 3且tableB.tableAId是唯一的,並且您對tableB對tableA執行的操作相同,則您至少保證一對一。 – Myles 2009-11-12 17:43:20

2

沒有明確的一對一關係。

但是,由於tbl1.id和tbl2.id是主鍵,tbl2.id是引用tbl1.id的外鍵,因此您創建了隱式1:0..1關係。

1

放1:1的相關項目到同一個表中的同一行。這就是「關係數據庫」中的「關係」來自哪裏 - 相關的東西進入同一行。

如果你想減少數據旅行過線的大小隻考慮兩種投影需要的列:

SELECT c1, c2, c3 FROM t1 

或在需要時創建不僅是項目相關的列的視圖,並使用該視圖:

CREATE VIEW V1 AS SELECT c1, c2, c3 FROM t1 
SELECT * FROM t1 
UPDATE v1 SET c1=5 WHERE c2=7 

請注意,BLOBs在SQL Server中存儲在行外,因此您不通過垂直劃分數據來節省大量磁盤IO。如果這些是非BLOB列,您可能會像描述的那樣受益於垂直分區,因爲您將少用磁盤IO來掃描基表。

0

這個怎麼樣。將第一個表中的主鍵鏈接到第二個表中的主鍵。

Tab1.ID(PK)< - > Tab2.ID(PK)

我的問題是我與在兩個強制字段2階段過程。整個過程可以被歸類爲一集(放在同一張表中),但是有一個初始階段和最後階段。

+0

我相信這是達米爾在第一個答案中所建議的。 – 2011-03-04 06:13:24

+1

你不能有強制的雙向約束。您需要實現事務,並按順序在SQL上下文中處理它們。那很簡單。 – PerformanceDBA 2011-03-10 04:27:13

0

在我看來,更好的解決方案是不用LINQ查詢讀取BLOB,而是在包含除BLOB之外的所有列的表上創建一個視圖

然後,您可以基於該視圖創建一個EF實體。

+0

沒有必要簽署你的帖子,所以SO會自動爲你做。此外,答案通常應該顯示符合您的建議的代碼示例。 :| – vdbuilder 2012-11-06 17:02:34