SQL表:与自身建立一对一关系吗?

时间:2018-10-19 12:38:34

标签: sql sql-server tsql relational-database

我想在一个表上与自己建立一对一的关系。

我有一个表MenuItem,但我希望这些项目能够有一个父级MenuItem。一个项目只能有一个父项,但是一个项目可以是多个项目的父项。

我目前正在使用链接表MenuItemParent,但是我不知道如何正确获取键和约束。它具有两列:MenuItemIdParentId。两者都是MenuItem表的外键。
如果我将第一列或两列都设为主键,我似乎最终会以一对多的关系结束。 (我正在从数据库生成代码,因此可以对其进行验证。)

如果我仅将第一列用作主键,则最终进入某种Schrödinger状态,其中MenuItem可以有一个父对象,也可以有多个父对象(即,生成的POCO既有MenuItem属性和EntitySet<MenuItem>属性。)我可以围绕此构建代码,但是从模型或生成的代码中都不清楚它实际上是什么样的关系。

我想念什么?

关于我为什么使用链接表,我正在尝试采用垂直分段,因为该数据将不会被频繁访问。

  

1-1的关系有效地划分了属性(列)   一个表分成两个表。这称为垂直分割。这是   通常是为了对表实体进行子分类,或者   原因,如果表格中各列的使用方式表明   需要更频繁地访问一些列   而不是其余的列。 (说一两列会被访问   每秒访问1000次,其余40列将被访问   一个月只有一次)。实际上,以这种方式对表进行分区将   针对这两个不同的查询优化存储模式。

发件人:https://stackoverflow.com/a/5112498/125938

编辑:撇开过早的优化,我现在知道我可以只使用MenuItem表中的ParentId列,但这真的比使用链接表好吗?

3 个答案:

答案 0 :(得分:3)

您应该使用外键将ParentID列添加到表MenuItem中。 这是一个有关如何执行此操作的示例。

alter table MenuItem
add ParentID int null;

alter table MenuItem
add constraint FK_MenuItemParent foreign key (ParentID) references MenuItem (ID);

现在您有了一个分层表,这意味着menuitem只能有一个parent,而其他许多menuitems可以和{{1 }}

仅当您需要menuitem关系时才需要parent

还可以按照建议在两列上创建唯一索引,但是请注意,ParentID经常为null,因此请添加一个子句来解决该问题

Link Table

答案 1 :(得分:0)

摆脱“链接”表。只需使用ID(PK)列和ParentID(FK)列设置MenuItem表即可。设置外键关系(我假设您可以弄清楚)。然后在ParentIDID列上设置“唯一键”约束。

答案 2 :(得分:-1)

我认为您应该尝试让1列是PRIMARY KEY,另一列是MenuItem的FOREIGN KEY REFERENCES。因为在数据库中与自身的1-1关系称为自我参考(您可以在Google中搜索更多信息),所以它不能有两个FOREIGN KEY。