【问题标题】:Modelling a tree of entities each with common and specific properties对实体树进行建模,每个实体都具有共同和特定的属性
【发布时间】:2017-05-04 23:50:33
【问题描述】:

我正在尝试为 SQL / Java 应用程序建模一组实体。

我将不得不处理不同的实体,例如汽车、卡车、无人机和船只。

所有这些实体实际上都是一种设备。一种设备可以依赖于另一种设备,例如拖车到卡车。

我可以只有一个设备实体,在设备依赖于另一个设备的情况下引用自己。

但是,如果这些设备有共同的属性,比如 parent_id、serial_number,它们也会有非常不同的属性,并且在一个实体中拥有如此多不同的属性会使它膨胀。

我希望每种设备都有特定的实体,一个用于船,一个用于卡车,等等...

我想知道如何根据 SQL 表对此进行建模。

任何提示?

【问题讨论】:

  • 这取决于许多变量。例如,您多久将一种新型设备引入系统?
  • @ZoharPeled 假设我从 3 种类型的设备开始,每种都有 15 到 20 个特定属性

标签: sql tree


【解决方案1】:

这开始是一条评论,但结果太长了,所以这里是:

首先,为了正确回答这个问题,您必须拥有尽可能多的数据 - 当然,最好有一份完整的需要存储的数据规范。更糟糕的是,找几个专业的 DBA,给他们完全相同的数据,你可能会发现自己有两种截然不同的方法。话虽如此,我会尽力回答你的问题。

在 EAV 反模式的灵活性和为每种设备类型设置表格的安全性之间需要权衡取舍。还有其他设计数据库的方法,例如“继承” - 您有一个设备基表,包含所有 common 属性,以及每个特定类型设备的不同表,与与基本设备表的 1:1 关系,以保存所有唯一属性。
这就是我在 cmets 中询问您经常向系统引入新型设备的原因 - 因为如果它是在高频下完成的,您可能需要考虑像 EAV 这样的东西,但如果这是一个低频,那么我建议为每个设备使用不同的表。

至于是否使用基本设备表的问题 - 这取决于其他因素,例如 - 是否有需要在外键中链接到所有设备类型的属性?在这个问题的上下文中我能想到的一个例子是manufacturer,甚至是colors——这两个属性应该对你写的所有设备类型都是通用的,但也需要1:M的关系——每辆卡车都由一个制造商制造,但同一制造商也可能制造汽车或船只,而且每样东西都至少有一种底色。

【讨论】:

  • 我会避免使用 EAV 模式。至于有没有基础装备表,你说这取决于一些因素,显示其中之一。仅考虑这一因素,对所有外键属性的通用性需求是否提倡使用或避免使用基表?
  • 还不足以决定。如果他们都站在多方面,那么是的。如果他们都在一侧,那就没有了。
猜你喜欢
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 2014-09-20
  • 2013-03-19
  • 1970-01-01
  • 2016-01-13
相关资源
最近更新 更多