我需要定義一對一的關係,並且似乎無法在SQL Server中找到正確的方式。在SQL Server中定義一對一的關係
爲什麼要問你一對一的關係?
我使用WCF作爲DAL(Linq),我有一個包含BLOB列的表。 BLOB幾乎沒有變化,每次查詢時都會浪費帶寬。
我看了一下this solution,雖然看起來好像是一個好主意,但我可以看到Linq在試圖實現這種方法時有一點缺陷。
任何想法?
我需要定義一對一的關係,並且似乎無法在SQL Server中找到正確的方式。在SQL Server中定義一對一的關係
爲什麼要問你一對一的關係?
我使用WCF作爲DAL(Linq),我有一個包含BLOB列的表。 BLOB幾乎沒有變化,每次查詢時都會浪費帶寬。
我看了一下this solution,雖然看起來好像是一個好主意,但我可以看到Linq在試圖實現這種方法時有一點缺陷。
任何想法?
一對一實際上經常用於超類型/子類型關係。在子表中,主鍵也充當父表的外鍵。這裏有一個例子:
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
沒有明確的一對一關係。
但是,由於tbl1.id和tbl2.id是主鍵,tbl2.id是引用tbl1.id的外鍵,因此您創建了隱式1:0..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來掃描基表。
這個怎麼樣。將第一個表中的主鍵鏈接到第二個表中的主鍵。
Tab1.ID(PK)< - > Tab2.ID(PK)
我的問題是我與在兩個強制字段2階段過程。整個過程可以被歸類爲一集(放在同一張表中),但是有一個初始階段和最後階段。
我相信這是達米爾在第一個答案中所建議的。 – 2011-03-04 06:13:24
你不能有強制的雙向約束。您需要實現事務,並按順序在SQL上下文中處理它們。那很簡單。 – PerformanceDBA 2011-03-10 04:27:13
在我看來,更好的解決方案是不用LINQ查詢讀取BLOB,而是在包含除BLOB之外的所有列的表上創建一個視圖。
然後,您可以基於該視圖創建一個EF實體。
沒有必要簽署你的帖子,所以SO會自動爲你做。此外,答案通常應該顯示符合您的建議的代碼示例。 :| – vdbuilder 2012-11-06 17:02:34
感謝上帝,在這裏有人知道SQL和關係數據庫。你已經證明這種關係是**明確的**。對於那些不確定關係是否爲1 :: 1的人,請注意,Customer.ID(也是Organisation.ID)是** unique **,因此只能有一個Customer行任何組織行。 – PerformanceDBA 2011-03-06 07:19:39
@PerformanceDBA:關係爲'1:0..1',因爲它沒有約束來確保父表中的每一行都有一個匹配的行。對於發佈的模式,對於'Organization'中的每一行,Customer中可以有零個或一個行,因此'1:0..1'。 – onedaywhen 2011-03-10 14:36:00
@oneday。謝謝,但你對錶面問題的解釋(顯而易見)與深層問題無關。你的評論的基礎,而不是評論本身,是不正確的。你和Adam有一樣的誤解(誰已經刪除了他的答案)。這個問題不能在評論中處理。如果您真的有興趣瞭解關係數據庫術語,請提出一個新問題,我會全面回答。我不會回覆進一步的評論。 – PerformanceDBA 2011-03-11 08:59:06