我想在一个表上与自己建立一对一的关系。
我有一个表MenuItem
,但我希望这些项目能够有一个父级MenuItem
。一个项目只能有一个父项,但是一个项目可以是多个项目的父项。
我目前正在使用链接表MenuItemParent
,但是我不知道如何正确获取键和约束。它具有两列:MenuItemId
和ParentId
。两者都是MenuItem
表的外键。
如果我将第一列或两列都设为主键,我似乎最终会以一对多的关系结束。 (我正在从数据库生成代码,因此可以对其进行验证。)
如果我仅将第一列用作主键,则最终进入某种Schrödinger状态,其中MenuItem可以有一个父对象,也可以有多个父对象(即,生成的POCO既有MenuItem
属性和EntitySet<MenuItem>
属性。)我可以围绕此构建代码,但是从模型或生成的代码中都不清楚它实际上是什么样的关系。
我想念什么?
关于我为什么使用链接表,我正在尝试采用垂直分段,因为该数据将不会被频繁访问。
1-1的关系有效地划分了属性(列) 一个表分成两个表。这称为垂直分割。这是 通常是为了对表实体进行子分类,或者 原因,如果表格中各列的使用方式表明 需要更频繁地访问一些列 而不是其余的列。 (说一两列会被访问 每秒访问1000次,其余40列将被访问 一个月只有一次)。实际上,以这种方式对表进行分区将 针对这两个不同的查询优化存储模式。
发件人:https://stackoverflow.com/a/5112498/125938
编辑:撇开过早的优化,我现在知道我可以只使用MenuItem
表中的ParentId列,但这真的比使用链接表好吗?
答案 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
表即可。设置外键关系(我假设您可以弄清楚)。然后在ParentID
和ID
列上设置“唯一键”约束。
答案 2 :(得分:-1)
我认为您应该尝试让1列是PRIMARY KEY,另一列是MenuItem的FOREIGN KEY REFERENCES。因为在数据库中与自身的1-1关系称为自我参考(您可以在Google中搜索更多信息),所以它不能有两个FOREIGN KEY。