如何在SQL数据库中表示层次结构

时间:2013-08-07 07:01:30

标签: python sql database-design orm sqlalchemy

我需要在数据库中表示地理对象的层次结构。每个对象都有一个名称和地理坐标(纬度/经度)。

层次结构的第一级可能是两个可能值之一:海洋 |的 Terrastiaral

第二级(对于海军陆战队)可能是Seas |里弗斯。 第3级(对于海洋)包含所有可能的海洋名称(例如波罗的海)。

另外,在第3级我可能想要链接每个海洋/河流与海洋相关,所有 Rivers < / strong>还应与其相关的一些 Sea 相关联。 还有第4,第5和第6 级别的层次结构,它们是较小类型的对象。

重要事项:此类层次结构中可能会跳过[3,4,5,6]级别的任意组合,即我们可能有级别(1,2,3,4,5)或(1,2,3)或(1,2,3,5)。

另外,我将在我的应用程序中使用sqlalchemy ORM 来表示对象。

我是否应该为不同的层次结构级别使用不同的表,并为父节点使用外键? 对于跳过的级别,我们可以为每个层次结构路径使用虚拟节点。

我应该为所有节点创建一个统一的表,并将其级别存储为整数值,父级的FK(即邻接列表结构)?

每种方法的优缺点是什么?

谁有其他想法(考虑到所有限制因素)?

2 个答案:

答案 0 :(得分:1)

这取决于您将如何处理数据。您的特殊表格方法适用于某些用途。

如果您使用统一表格,可以采用两种方法。第一个是邻接列表模型。关系模式中的邻接列表模型与在对象世界中看起来的方式不同。 Brief Article

第二个是嵌套集模型。 Wikipedia Article第一个更容易更新,而第二个更容易用于复杂查询,例如查找给定的子树。

答案 1 :(得分:0)

我能想到的最好的桌面设计如下

table hirarchy

columns : hirarchyid | hirarchylevel



table hirarchy_possible_values

columns : possiblevalueid | possiblevalue | hirarchyid



table geo_object

columns : objectid | objectName| latitude | longitude  | hirarchyid | possiblevalueid