数据库如何建立1:1的关系模型

时间:2011-01-10 08:37:49

标签: sql database linq linq-to-sql database-design

(VS2008,SqlCE 3.5)

我尝试模拟 1:1 关系。所以我把外键放在父表中,拿着子表的PK。然后我将外键设置为UNIQUE。仍然在我创建实体类(使用SqlMetal)时,子类引用了父类的 EntitySet ,而不仅仅是单个实体。这似乎是 m:1 关系?那么我需要做些什么才能使它成为1:1?


EDIT1:

我很困惑..试着制作一套,像这样:

StrategySet(ID, EntryStrategyID{Unique}, ExitStrategyID{Unique})   
EntryStrategy(ID) 
ExitStrategy(ID) 

这是m:1不是吗?虽然看起来FK是在父母身上,或者我们不会将StrategySet命名为父母?我现在如何以1:1的方式改变这一点?

3 个答案:

答案 0 :(得分:1)

首先,parent是FK从child引用的表。所以你不能说你的父表引用孩子:它不正确。

其次,可以通过以下方式建立1:1的关系:

  • 两个表中的主键
  • 父级中的主键和子级中的唯一外键

所以在你的情况下,架构是正确的。我想你应该再次检查结构,并查看this article

答案 1 :(得分:1)

如果EntryStrategyExitStrategy中的所有列都相同,那么您只需要这样(仅添加所有其他列)。

alt text

如果EntryStrategyExitStrategy有不同的列,请使用此列。将所有常用列保留在Strategy表中。 EntryStrategyExitStrategy仅包含特定于每个列的列。

alt text

由于表的垂直分区,这也是1:1的一般示例。

<强>之前

alt text

<强>后

alt text

答案 2 :(得分:0)

让我了解你所描述的情况。

您有一组构成“策略”的字段。字段的子集在概念上是“EntryStrategy”,字段的非交叉子集是“ExitStrategy”。

在您的情况下,构成“EntryStrategy”的给定值集可以与构成“ExitStrategy”的一组且仅一组值相结合。当你说有1:1的对应关系时,这就是你的意思。

正如smirkingman先前所说,在经典的关系数据库建模中,所有这些字段都属于一个表,因为没有字段的子集出现在多个记录中。

如果你可以为一个EntryStrategy设置多个ExitStrategies,那么你将有两个表,其中EntryStrategy是父项,ExitStrategies是子项,ExitStrategy记录将有一个指向EntryStrategy父记录的外键。

如果你可以为一个ExitStrategy设置多个EntryStrategies,那么你将有两个表,其中ExitStrategy是父项,EntryStrategies是子项,EntryStrategy记录将有一个指向ExitStrategy父记录的外键。

如果您可能有多个与多个ExitStrategies相关联的EntryStrategies,那么您将拥有多对多关系,这需要第三个表来维护对应关系。

经典数据库建模的原则会将您的所有字段放在一个表中。

正如St Woland所写,您可以通过使用两个表来强制执行1:1关系,其中子表中的外键是唯一索引。但是两个表通常用于1对多关系。

正如Damir所写,您可以通过使用三个表来强制执行1:1关系,其中第三个表具有对其他两个表中的每个表的外键,并且两个外键字段都标记为唯一索引。但是,通常情况下,当您拥有多对多关系时,您只能以这种方式使用三个表。

我认为您对自动数据建模工具的期望过高,期望他们构建代表您非常规方法的实体。

你的主要问题的答案很简单。我如何表示1:1的关系?你把它们放在一张表中的同一条记录中!