将n转换为m关系,将特化转换为关系模型

时间:2016-02-14 10:38:11

标签: relational-database entity-relationship entity-relationship-model relational-model

我找到了将eer图转换为相应关系图的最佳方法。我有一个带有一些特殊化的泛化实体,它们与其他实体有不同的关系。泛化实体又与实体建立了n到m的关系。下图说明了这种情况: Eer diagram with specialization and n-to-m relationship

由于两个专业实体有不同的关系,我应该将它们转换为两个单独的表。同时,我应该创建一个建模n-to-m关系的表,该关系将实体'User'与实体'Newsletter'(或更好,它的特化)联系起来。如何应对这个问题?我没有找到任何有用的信息。

我认为唯一可行的解​​决方案是创建两个独立的表来建模n-to-m关系,一个链接到'User'和'Programming newsletter'表,一个链接到'User'和'Travel newsletter'表。但我正在寻找意见。

2 个答案:

答案 0 :(得分:2)

我认为没问题。我将使用下表来实现您的图表:

User (nickname PK, name, address)
Newsletter (name PK, supervisor, type)
Subscription (user_nickname PK/FK, newsletter_name PK/FK)
Programming_Newsletter (newsletter_name PK/FK, type FK, language)
Travel_Newsletter (newsletter_name PK/FK, type FK, means_of_transport)

我可能不会使用用户昵称/通讯名称作为键,因为我更喜欢稳定的紧凑标识符,但这是另一个主题。

答案 1 :(得分:1)

我认为有几种方法可以解决这个问题。

最简单的一种方法是打破假设"由于两个专业实体有不同的关系,我应该将它们转换为两个单独的表"。如果您将专业化设置放在一个表格中,则可以使用 STI (Single table inheritance) 进行概括。但是这种方法有一个缺点,那就是你的表对那些不属于具体专业的关系有很多NULL值。

另一种方法是使用 CTI (Class Table Inheritance) 。此方法假定您的泛化的每个专业化都有一个特定的表。这将解决NULL问题,但它可能会引入性能问题,因为您的代码需要急切地从泛化表加入到几乎每个查询的特化上才能检索它们。

我没有在用户和简报之间的n-to-m关系中看到这个问题。您应该能够有一个常规的中间表来创建两者之间的关联,因为没有其他属性可以补充这种关系。