【问题标题】:Table relationship for subtypes子类型的表关系
【发布时间】:2010-02-23 02:08:23
【问题描述】:

我有一个名为“网站”的父表,其中包含有关网站的记录。我有一个名为“SupportSystem”的子表,它保存有关不同类型的支持系统的记录,例如电子邮件、电话、票务、实时聊天等。有一个中间表“Website_SupportSystem”以多对多的关系连接这些表。

如果网站的支持系统是票务,我还想记录软件平台。例如WHMCS。我的直觉是创建一个名为 SupportPlatform 的新查找表,并将其与现有的连接表“Website_SupportSystem”相关联并将数据存储在那里。但是,SupportSystem 和 SupportPlatform 之间没有任何关系。如果我将这些联系起来,那么我最终会得到一个循环引用。

你能看出我做错了吗?对这些数据建模的最佳方法是什么?

【问题讨论】:

    标签: mysql database-design


    【解决方案1】:

    您可以使用超类型/子类型关系,如图所示。

    • SupportSystem 表包含所有支持系统共有的列。
    • EmailTicketingPhoneLiveChat 表格都有各自特定的列。
    • 子类型表中的主键也是超类型表的外键。

    【讨论】:

      【解决方案2】:

      我将在“SupportSystem”表中添加一个新列“SupportPlatformId”,该列查找表“SupportPlatform”,因为“SupportSystem”到“SupportPlatform”可能是一对一或多对一的。

      因此:网站 ->(通过 Website_SupportSystem)SupportSystem -> SupportPlatform

      【讨论】:

        【解决方案3】:

        有关支持平台的数据应存储在 SupportPlatform 表中。

        您可以在 Website_SupportSystem 表中添加第三个外键,即 SupportPlatfromID。如果你这样做,你的中间表现在记录了一个多对多对多的三元关系。如果这反映了现实,那就这样吧。

        如果要关联 SupportSystems 和 SupportPlatforms,只需使用中间表作为连接中的中间表即可。您甚至可以通过中间表执行三路连接来连接所有三个实体。

        另一种方法是使用一对外键(即 SupportSystemID 和 SupportPlatformID)创建另一个中间表 SupportPlatform_SupportSystem。如果这能更好地反映现实,那就这样吧。然后,如果需要,您可以使用五表连接将它们全部连接在一起。

        【讨论】:

          猜你喜欢
          • 2012-01-12
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 2015-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-28
          相关资源
          最近更新 更多