介绍
大家好,这主要是关于数据库设计中的继承和规范化技术及其在实体关系图中的适当表示的分类/理论问题。在实际实现中,它不会带来挑战,因为您只需将有问题的属性设置为IS NOT NULL即可。然而,对于图形表示,我对如何正确地做它有点困惑。这是一个 github gist 链接,其中包含一个交互式美人鱼图,表示特定示例的假设场景:gist
问题
重要部分在本节中: 假设我们有一个名为 PRODUCT 的实体,它可能具有不同类型的属性,具体取决于所讨论的产品(例如物理产品/数字产品)。出于这个原因,我们引入了两个“子表”,其 PK 引用 PRODUCT 的 FK 属性product_type_id。很明显,一个 PRODUCT 只能有一个单一的 product_type_id,但是因为它可以是PhysicalProduct或DigitalProduct,这两个“子表”与 PRODUCT 有什么样的关系?到目前为止,我推断它必须是图中所示的一对(零或一) 。这就是问题所在(也许不存在)。如果我们有两个一到(零或一)与强制性IS NOT NULL属性的关系是否在视觉上推断出两个一对零关系的可能性,或者它是否没有在我的脑海中点击,这就是在这种情况下应该如何?
这里的问题是多个表做同样的事情。在您的模式中, PhysicalProduct 和 DigitalProduct 都描述了一个product。这是规范化的禁忌。
想想产品。你在卖什么,可以是物理的也可以是数字的。为什么“要么……要么”,为什么不能两者兼而有之?例如,我可以有精装书和电子书。或者同一首歌的 mp3 和黑胶唱片……我没有数字杂货店,但如果你开始用两张不同的桌子(蔬菜/浆果)来描述土豆和草莓,那还是很奇怪。
像这样的情况,通常由EAV数据模型解决。PRODUCT 表是产品的“一般”描述,我们只有一个 PRODUCT_ATTRIBUTE 表,它将以多对一的方式指向 PRODUCT。
您放入 PhysicalProduct 和 DigitalProduct 的所有字段(“weight”、“dimensions”、“file_size”等)都成为 PRODUCT_ATTRIBUTE 表中的属性。如果您的数据库不支持变体数据类型,您可以创建多个字段,如“value_int”、“value_string”,或者
text
在必要时只在客户端上转换一个字段。