【问题标题】:Table relationship for subtypes子类型的表关系
【发布时间】:2010-02-23 02:08:23
【问题描述】:
我有一个名为“网站”的父表,其中包含有关网站的记录。我有一个名为“SupportSystem”的子表,它保存有关不同类型的支持系统的记录,例如电子邮件、电话、票务、实时聊天等。有一个中间表“Website_SupportSystem”以多对多的关系连接这些表。
如果网站的支持系统是票务,我还想记录软件平台。例如WHMCS。我的直觉是创建一个名为 SupportPlatform 的新查找表,并将其与现有的连接表“Website_SupportSystem”相关联并将数据存储在那里。但是,SupportSystem 和 SupportPlatform 之间没有任何关系。如果我将这些联系起来,那么我最终会得到一个循环引用。
你能看出我做错了吗?对这些数据建模的最佳方法是什么?
【问题讨论】:
标签:
mysql
database-design
【解决方案1】:
您可以使用超类型/子类型关系,如图所示。
-
SupportSystem 表包含所有支持系统共有的列。
-
Email、Ticketing、Phone 和 LiveChat 表格都有各自特定的列。
- 子类型表中的主键也是超类型表的外键。
【解决方案2】:
我将在“SupportSystem”表中添加一个新列“SupportPlatformId”,该列查找表“SupportPlatform”,因为“SupportSystem”到“SupportPlatform”可能是一对一或多对一的。
因此:网站 ->(通过 Website_SupportSystem)SupportSystem -> SupportPlatform
【解决方案3】:
有关支持平台的数据应存储在 SupportPlatform 表中。
您可以在 Website_SupportSystem 表中添加第三个外键,即 SupportPlatfromID。如果你这样做,你的中间表现在记录了一个多对多对多的三元关系。如果这反映了现实,那就这样吧。
如果要关联 SupportSystems 和 SupportPlatforms,只需使用中间表作为连接中的中间表即可。您甚至可以通过中间表执行三路连接来连接所有三个实体。
另一种方法是使用一对外键(即 SupportSystemID 和 SupportPlatformID)创建另一个中间表 SupportPlatform_SupportSystem。如果这能更好地反映现实,那就这样吧。然后,如果需要,您可以使用五表连接将它们全部连接在一起。