在SQL Server中定义一对一的关系

我需要定义一个一对一的关系,似乎无法find在SQL Server中正确的方式。

为什么要问你一对一的关系?

我正在使用WCF作为DAL(Linq),我有一个包含BLOB列的表。 BLOB几乎不会改变,每次查询时都会浪费带宽。

我看了一下这个解决scheme ,虽然看起来好像是一个好主意,但是当我试图实现这个方法的时候,我可以看到Linq有一点点的缺陷。

有任何想法吗?

一对一实际上经常用于超types/亚型关系。 在子表中,主键也作为父表的外键。 这里是一个例子:

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 

为什么不让每个表的外键独特?

没有明确的一对一关系。

但是,由于tbl1.id和tbl2.id是主键,而tbl2.id是引用tbl1.id的外键,所以创build了隐式的1:0..1关系。

将1:1相关项目放在同一个表中的同一行。 这就是“关系数据库”中的“关系”来自相关的东西进入同一行的地方。

如果您想要减less通过线路传输的数据的大小,请考虑只投影所需的列:

 SELECT c1, c2, c3 FROM t1 

或创build一个只投影相关列并在需要时使用该视图的视图:

 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列,则可能会像描述的那样受益于垂直分区,因为您将less用磁盘IO来扫描基表。

这个怎么样。 将第一个表中的主键链接到第二个表中的主键。

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

我的问题是我有一个2阶段的过程与强制性的领域都在。 整个过程可以归类为一个(插入同一个表),但是有一个初始阶段和最后阶段。

在我看来,一个更好的解决scheme不读取与LINQ查询的BLOB将创build一个包含除BLOB之外的所有列的表上的视图

然后,您可以基于该视图创build一个EF实体。