关系数据建模问题 - 需要相同“子数据”的2个不同表

时间:2011-02-21 00:59:40

标签: database-design data-modeling relational-database

我在这里阅读了许多关于1-1关系,建模对象类型关系等的答案。我正在尝试做一些我不确定什么是正确的方法。

我有两个不同的表,它们都需要引用/包含多边形列表(多边形实际上表示为外部循环和任意数量的内部循环来表示表面中的孔)。这两个表中的每一个都是完全不同的属性集。

以下是仅有1个表引用多边形的模型视图:

现在我想要第二个表,每一行也代表一组多边形。我知道如何从面向对象的角度来做这件事,但是关系视图让我对正确的方法感到困惑。

一种方法是在polygonwitholes表中添加另一个外键,一个是null,另一个是填充。这显示在这里:

这似乎不对。所以我想到了一个中间表,但这些关系看起来更像面向对象而不是关系。这是一种不合理的方式,是否拥有这些外键?或者我可以有一个整数字段,而不是向数据库添加任何约束它是另一个表的外键,并将它用于那个时候使用的表?从查询的角度来看,我将不得不检索table1或table2中每行的每个多边形中的所有点。

所以我想出的一个选项就是这个,但后来我想到了如何进行查询,而且看起来似乎并不正确:

enter image description here

我知道对于真正的数据建模者来说,这将是一个显而易见的问题!这个网站对我来说很棒,这是我的第一个问题,我希望它有意义!那么有关于如何建模的建议吗?

(好吧,我试图发帖,但图片没有出现。试图让某人为我发帖)

2 个答案:

答案 0 :(得分:1)

所以我在与人们协商后做出了决定。

我选择了第3范式,并制作了中间表,将表面与多边形和网格连接到多边形。最终的解决方案有以下表格:

表面(ID主键)
SensorGrid(ID主键)

多边形(ID主键)
Point(ID主键,PolygonID外键)

Surface_Polygon(surfaceID,polygonID:复合主键)
SensorGrid_Polygon(sensorGridID,polygonID:复合主键)

因此,2个中间表将多边形与它们在网格或表面中相关联。我将检查以确保额外的连接不会对性能造成太大影响。这是最干净的解决方案,如果将来真的需要优化性能,我会考虑为SurfacePolygon,SurfacePoint,SensorPolygon和SensorPoint制作单独的表,并摆脱中间表。

感谢您的帮助。

答案 1 :(得分:0)

好的,我要去试一下。如果这真的是1比1,并且给定的PolygonwithHoles不能同时是表面和网格,那么我会使用你的最后一个例子,但是我会丢弃容器表,因为它完全是多余的。如果由于某种原因你想要将所有多边形孔作为曲面和网格,那么总是可以使用sql union创建该表。