提问人:Jos 提问时间:7/9/2014 最后编辑:Jos 更新时间:7/9/2014 访问量:69
关系型数据库中难处理的分层数据
Difficult kind of Hierachical Data in Relational Database
问:
我有“组件”,可以以不同的方式组装成一个“系统”。我希望我的数据库能够保存所有这些“组件”,它们的特定类型数据,并定义它们如何相互连接以形成一个“系统”。
这些系统通常是齿轮箱,它们可以具有相当复杂的分支设计。让我们从一个简单的例子开始:
该系统由质量(水平线)和刚度(垂直线)组成。齿轮和离合器是质量的类型,成对出现。颜色表示由于传动比而产生的不同分支速度。这里有一个(糟糕的)例子,说明我如何存储这个特定插图中的所有内容:
ID | Type | Clutch | Ends | DrivenBy | NoOfTeeth| Mass | Stiffness
--- | ---- | ------ | ---- | --------- | -------- | ---- | ---------
1 | Mass | | Input1 | | | 5 |
2 | Stiffness | | | | | | 15
3 | Mass | 1.1 | | | | 2 |
4 | Mass | 1.2 | | | | 3 |
5 | Stiffness | | | | | | 20
6 | Gear | | | | 10 | 4 |
7 | Stiffness | | | | | | 30
8 | Gear | | | | 4 | 5 |
9 | Gear | | | 8 | 7 | 2 |
10 | Stiffness | | | | | | 40
11 | Mass | | | | | 4 |
12 | Stiffness | | Output1 | | | | 10
13 | Gear | | | 6 | 5 | 4 |
14 | Stiffness | | | | | | 20
15 | Mass | 2.1 | | | | 4 |
16 | Mass | 2.2 | | | | 3
17 | Stiffness | | | | | | 30
18 | Mass | | Output2 | | | 2 |
显然,这不是存储数据的好方法。这种设计模式在某种程度上类似于“重复属性”,因为每种组件类型都有不同的属性要填充。我可以为每种类型的组件创建一个表格,但是当查看其他示例时,事情变得更加复杂,例如这个 2 级变速箱:
也有超过 1 个输入和多个输出的例子,但由于声誉低,我无法发布更多链接。
无论哪种方式,您都会看到通常的分层数据存储在这里不适用,因为数据不是纯粹的“树形”,其中所有内容都从 1 个主分支分支出来。
我认为,即使我可以以上述方式存储数据,但在编程阶段也会遇到巨大的困难。
更复杂的是,这些变速箱实际上是一个更大系统的子系统。
那么,关于存储此类数据的好方法有什么建议吗?
答:
也许这是一种可能的方法?
在这里,您将看到有一个名为 GearboxBranch 的“主”表,用于跟踪变速箱中的所有元素,为它们提供一个 id 并确定该元素存在于哪个分支中。
然后,对于单元本身,质量在其专用表中定义,刚度也是如此。然后,齿轮和离合器(质量类型)在其透视表中定义。齿轮表中存在递归关系,因为一个齿轮必须由至少一个其他齿轮驱动。
此外,带有轴端的表格定义了齿轮箱中的哪些元件是输入或输出,以及它们的数量。
我似乎看不出这种方法有任何问题,但我有点不确定如何从数据库中获取数据。恐怕会涉及相当多的编码。
评论