我在一个网站的CMS数据库(SQL Server 2008)中有以下表格:
SiteMap Page Link ========= ========= ========= SiteMapId PageId LinkId LeftNode Name Name RightNode UrlId Url -- etc -- -- etc --
每个SiteMap行都需要链接到Page或Link表中的一行,这就存在问题。什么是最好的方式?
任何人都可以建议我应该使用哪种,或者提出更好的选择?感谢。
答案 0 :(得分:1)
如果每个SiteMap只能连接一个页面或链接,那么我会选择第一个选项。在这种情况下,您不会像第二个选项那样具有空值,也不会像第三个选项那样具有不必要的列。
获取所有页面(或链接)非常简单,因为它只是一个简单的内部联接。
答案 1 :(得分:1)
就个人而言,事情选项2是最简单的方法,以确保您的一个且只有一个记录被强制执行。应该设置触发器以确保两个值中的至少一个为空。在这种情况下,使用空值没有任何内在的坏处。
答案 2 :(得分:0)
这些表可以支持多对多关系作为另一种选择:
<强> SiteMapPage 强>
SiteMapId
的PageId
<强> SiteMapLink 强>
SiteMapId
LINKID
编辑:但反思不可能比你的选择1更有用......抱歉!
答案 3 :(得分:0)
另一个可能性:使用SiteMapId,PageId和LinkId添加新表并添加约束 (((PageId IS为NULL或LinkId为空)AND(PageId不为NULL或LinkId为非NULL))和SiteMapId不为空))
然后你可以使用新表加入其他两个表...只是我的袖口想法的30秒。 (*未经测试)
答案 4 :(得分:0)
如果有一个名为SiteItem的表,其中包含SiteMapID,并且与Page表和Link表之间存在1-1关系,那么SiteItem表中的条目在页面或链接表中都有一个条目。在这种情况下,Page和Link表就像SiteItem表的子类。
答案 5 :(得分:0)
最后通过直接向主键添加约束来解决这个问题,因此SiteMapId是一个自动编号/身份,与PageId和LinkId具有一对一的关系。它不会停止为一个SiteMap行添加Page和Link行,但会避免使用任何冗余列或其他表。