存储分层数据的最佳方式(父< - 子< - 孙子)



>我有一个数据集,我需要使用它,它代表了一台大型机器的零件原理图。我需要为此数据集提供适当的数据库架构,并且无法想出有效表示此数据的东西。

顶级组件是最大的"结构",当您向下遍历层次结构时,数据表示内部组件或构成内部组件的组件。例如,在顶层,可以有一个发动机作为 1 级组件,然后 2 级组件是活塞,它进入发动机,3 级组件可以是进入活塞的垫圈。

此表示形式分布在 CSV 文件的几百行中。ID 有 3 列:

  • 一个master_id,所有组件都有
  • aparent_id,所有组件也都有,但它们的值因情况而异。
    • 如果所讨论的组件是 1 级部件,则parent_id是其自己的master_id。
    • 如果相关组件是 2 级部件,则parent_id是 1 级部件的master_id
    • 如果所讨论的组件是 3 级部件,则parent_id是 2 级部件的master_id

基本上,任何组件的父 id 都是其上级组件的主 ID。所以 lv1 父级是 lv1 主节点(因为它是根),lv2 父级是 lv1 主节点,lv3 是 lv2 主节点。此外,多个组件可以共享一个父 ID,这意味着多个 lv2 部件可以具有相同的父 ID。

  • 一个grandparent_id,只有 3 级组件才有(但由于某种原因不是所有的 lv3 组件(idk 我没有制作这个数据集))。如果组件是 lv3 并且具有grandparent_id,则祖父 ID 是返回到 lv1 组件的主 ID 的直接链接。是的,令人困惑吧?

这里有一个例子。lv3 组件的master_id为 700000137,parent_id为 600000049,grandparent_id为 500000006。如果我们查看主控600000049 的组件,我们将看到这是一个父 id 为 500000006 的 lv2 组件,这是 lv1 组件的主 id,并且再次是此 lv3 组件的祖父级。

我在这篇文章的开头说我需要为这个数据集提供一个数据库表示(它后来在项目中使用,但数据组织是第一步)。我对使用 PostgreSQL 很舒服,所以我最初的想法是制作 3 个表,主表、父表和祖父表,根据我正在解析的键,我会将其插入到适当的数据库中,如果有父键或祖父键,我会将其插入到适当的数据库中,并将外键放回其他表。但我意识到这可能会变得非常毛茸茸的,特别是因为可能有多个外键链接回单个主 id,而且我觉得通过这种表示,一些数据可能会重复,我显然不希望发生这种情况。

我的第二个想法是使用类似python字典的东西,我基本上构建了一个类似树的结构,其中lv1组件在顶层,lv2组件在第二层,依此类推。然后我可以将字典转换为 JSON,因为 Python 这样很好,并将该 json blob 存储在数据库中。但是,这个 JSON blob 可能会变得非常大,尽管我想这只是随着数据集的增长我必须忍受的事情。我得到的这部分原理图仅适用于一台机器,所以基本上我的数据库中的每个条目都是这样的

id | name      | json
----------------------
1  | machine_a | JSON_BLOB_MACHINE_A
----------------------
2  | machine_b | JSON_BLOB_MACHINE_B
etc...

我的第二种方法是否比尝试创建表示每个部分级别的单独表和外键返回父级更好?如果有更好的方法来使用 Postgres,我将不胜感激您解释一下。否则,我可能会走后一条路线。谢谢!

如果您不需要在其他机器中连接零件,那么我认为零件的jsonb列可能是最好的。您仍然可以使用 GIN 索引对 jsonb 进行索引,并从查询中获得非常好的性能。

只要部件不在多台计算机之间共享,这将使在所有计算机之间更新部件属性变得棘手,那么您可能没问题。

这应该使对机器的查询变得非常轻松,因为大多数数据都是独立的。

相关内容

最新更新