【问题标题】:How to represent hierarchy in SQL database如何在 SQL 数据库中表示层次结构
【发布时间】:2013-08-08 10:25:47
【问题描述】:

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 您想存储层次结构中每个级别的不同内容,还是只存储名称和纬度/经度?

标签: python sql database-design orm sqlalchemy


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    table hirarchy
    
    columns : hirarchyid | hirarchylevel
    
    
    
    table hirarchy_possible_values
    
    columns : possiblevalueid | possiblevalue | hirarchyid
    
    
    
    table geo_object
    
    columns : objectid | objectName| latitude | longitude  | hirarchyid | possiblevalueid
    

    【讨论】:

    • 如何在您建议的数据库模式中建立父子关系?另外,您能否解释一下“hirarchy_possible_values”的用途?
    猜你喜欢
    • 2020-12-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2013-01-09
    • 2011-08-27
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    相关资源
    最近更新 更多