代码之家  ›  专栏  ›  技术社区  ›  Nick

数据库设计查询-如何联接这些表?

  •  1
  • Nick  · 技术社区  · 15 年前

    我在CMS数据库(SQL Server 2008)中为一个网站提供了以下表格:

    SiteMap       Page          Link
    =========     =========     =========
    SiteMapId     PageId        LinkId
    LeftNode      Name          Name
    RightNode     UrlId         Url
                  -- etc --     -- etc --
    
    • 站点地图表包含使用 nested set model ,主要用于生成网站导航。
    • 页表包含CMS系统服务的页的数据。
    • 链接表包含在站点导航中显示但不由CMS提供的URL(例如到其他站点的外部链接)。

    每个站点地图行都需要链接到页面或链接表中的一行,问题就在于此。最好的方法是什么?

    1. 向页面和链接表添加SiteMapID外键-缺点:允许多个记录(在两个表中)引用同一个SiteMap行。
    2. 将pageid和linkid列添加到sitemap表中-缺点:一列将是多余的,因为它始终包含空值或0。
    3. 将pageorlinkid列添加到sitemap表中,并将位字段列标记为包含pageid或linkid-缺点:无法向关系添加约束以确保它们包含有效值。

    有人能建议我应该使用上面的哪一个,或者想出一个更好的选择吗?谢谢。

    6 回复  |  直到 15 年前
        1
  •  1
  •   aks    15 年前

    如果每个站点地图只能连接一个页面或链接,那么我将选择第一个选项。在这种情况下,您不会像在第二个选项中那样拥有空值,也不会像在第三个选项中那样拥有不必要的列。

    获取所有页面(或链接)将非常容易,因为它只是一个简单的内部连接。

        2
  •  1
  •   HLGEM    15 年前

    就我个人而言,选项2是确保您的一个且只有一个记录被强制执行的最简单的方法。应设置触发器以确保两个值中至少有一个为空。在这种情况下,拥有空值本身没有什么不好的。

        3
  •  0
  •   davidsleeps    15 年前

    您可以将这些表支持的多对多关系作为另一个选项:

    位置贴图
    蛛网膜
    佩奇

    网站地图
    蛛网膜
    林奇

    编辑:但是经过深思熟虑不可能比你的选项1更有用…对不起!

        4
  •  0
  •   Mark Schultheiss    15 年前

    另一种可能性:添加一个具有sitemapid、pageid和linkid的新表,并添加约束 ((pageid为空或linkid为空)和(pageid不为空或linkid不为空),SiteMapid不为空)

    然后你就可以用新桌子加入到另外两张桌子上了……就在我30秒的休息时间里。 (未经检验)

        5
  •  0
  •   Decker97    15 年前

    如果有一个名为siteitem的表,其中包含sitemapid,并且与页表和链接表都有1-1关系,即siteitem表中的一个条目在页表或链接表中都有一个条目,该怎么办?在这种情况下,页面和链接表类似于SiteItem表的子类。

        6
  •  0
  •   Nick    15 年前

    最后通过直接向主键添加约束解决了这个问题,因此SiteMapID是一个与pageID和linkid一对一关系的自动编号/标识。它不会停止为一个站点地图行同时添加页面和链接行,而是避免任何冗余列或附加表。