在SQL Server中定义一对一关系

Asked
Viewd43897

33

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

您为什么要一对一的关系?

我将WCF用作DAL(Linq),并且我有一个包含BLOB列的表。BLOB几乎不会更改,并且每次查询时都无法在BLOB上进行传输。

我查看了此解决方案,尽管这似乎是个好主意,但在尝试实现此方法时,我只能看到Linq有点不满。

有什么想法吗?

6 个答案

76

实际上,一对一关系经常用于超类型/子类型关系中。在子表中,主键还用作父表的外键。这是一个示例:

”

 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
 
  • @PerformanceDBA:我删除了我的答案,因为讨论进行了。根据要求,我发布了一个问题,以便您可以正确回答:http://stackoverflow.com/questions/5279984/defining-a-11-relationship-within-a-relational-database

    Adam RobinsonMarch 12, 2011 00:48
  • @PerformanceDBA:该关系为1:0..1,因为它没有约束来确保对于父表中的每一行在子类型表之一中都有匹配的行。对于发布的架构,Organization中的每一行在Customer中可以为零,也可以为一行,因此为1:0..1

    onedaywhenMarch 10, 2011 14:36
  • 感谢上帝,这里的人知道SQL和关系数据库。您已证明该关系是显式的。请注意,对于不确定关系是1 :: 1的用户,请注意,Customer.ID(也是Organisation.ID)是唯一,因此只能有一个任何组织行的客户行。

    PerformanceDBAMarch 06, 2011 07:19
  • @有一天。谢谢,但是您对表面问题的解释(显而易见)与更深层次的问题无关。您的评论依据而不是评论本身是不正确的。您和亚当(他已删除答案)有着相同的误解。该问题无法在评论中处理。如果您真的有兴趣了解关系数据库的术语,请提出一个新的问题,我将完全回答。我将不回答其他评论。

    PerformanceDBAMarch 11, 2011 08:59
0

我认为,一种不使用LINQ查询读取BLOB的更好解决方案是在包含除BLOB列之外的所有列的表上创建一个 view

然后您可以基于视图创建EF实体。

  • 不必签署您的帖子,SO会自动为您签名。另外,答案通常应显示符合您建议的代码示例。: vdbuilderNovember 06, 2012 17:02
0

如何?将第一个表中的主键链接到第二个表中的主键。

Tab1.ID(PK) Tab2.ID(PK)

我的问题是我有两个阶段的过程,两个过程中都包含必填字段。整个过程可以归为一集(放在同一张表中),但是有一个初始阶段和最后一个阶段。

  • 您没有强制性的双向约束。您需要实现事务,并按顺序在SQL上下文中处理它们。那很容易。

    PerformanceDBAMarch 10, 2011 04:27
  • 我相信达米尔在第一个答案中就是这样建议的。

    André HauptfleischMarch 04, 2011 06:13
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
 

请注意,BLOB是行外存储在SQL Server中的,因此您不会通过垂直分区数据来节省很多磁盘IO。如果这些是非BLOB列,则您可能会从如上所述的垂直分区中受益,因为您将减少磁盘IO来扫描基表。

3

为什么每个表的外键都不唯一?

  • 但是,如果tableA.id = 3且tableB.tableAId = 3且tableB.tableAId是唯一的,并且对tableB到tableA进行相同操作,则可以保证最多一对一。

    MylesNovember 12, 2009 17:43
  • 因此,如果我在表= 3中具有键,而在表= 4中具有键,则它们在表中是唯一的,但是没有关系。

    JeffONovember 12, 2009 17:08