在SQL Server中定义一对一的关系
我需要定义一个一对一的关系,似乎无法find在SQL Server中正确的方式。
为什么要问你一对一的关系?
我正在使用WCF作为DAL(Linq),我有一个包含BLOB列的表。 BLOB几乎不会改变,每次查询时都会浪费带宽。
我看了一下这个解决scheme ,虽然看起来好像是一个好主意,但是当我试图实现这个方法的时候,我可以看到Linq有一点点的缺陷。
有任何想法吗?
一对一实际上经常用于超types/亚型关系。 在子表中,主键也作为父表的外键。 这里是一个例子:
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实体。