1

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

层次结构的第一级可能是两个可能值之一:Marine | 地层

第二级(对于Marine)可能是 Seas | 河流。 第三级(对于Seas)包含所有可能的海洋名称(例如波罗的海)。

此外,在第 3 层,我可能想将每条海洋/河流与其相关的海洋联系起来,所有河流都应该另外与它相关的一些海洋联系起来。还有第 4、第 5 和第 6级层次结构,它们是较小类型的对象。

重要提示:在这种类型的层次结构中可以跳过 [3, 4, 5, 6] 级别的任何组合,即我们可以有级别 (1, 2, 3, 4, 5) 或 (1, 2, 3) 或 ( 1、2、3、5)。

此外,我将在我的应用程序中使用 sqlalchemy ORM进行对象表示。

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

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

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

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

4

2 回答 2

3

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

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

第二个是嵌套集合模型。维基百科文章。第一个更容易更新,而第二个更容易用于复杂查询,例如查找给定的子树。

于 2013-08-07T09:51:38.403 回答
0

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

table hirarchy

columns : hirarchyid | hirarchylevel



table hirarchy_possible_values

columns : possiblevalueid | possiblevalue | hirarchyid



table geo_object

columns : objectid | objectName| latitude | longitude  | hirarchyid | possiblevalueid
于 2013-08-07T07:17:09.343 回答