【问题标题】:Best Way to Store Hierarchal Data (Parent <- Child <- Grandchild)存储分层数据的最佳方式(父 <- 子 <- 孙)
【发布时间】:2019-11-15 02:52:02
【问题描述】:

我有一个需要处理的数据集,它代表大型机器的零件示意图。我需要为此数据集提出一个适当的数据库模式,并且在想出一些可以有效表示此数据的东西时遇到了麻烦。

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

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

  • master_id,所有组件都有
  • parent_id,所有组件也都有,但它们的值会因情况而异。
    • 如果有问题的组件是 1 级部件,parent_id 就是它自己的 master_id。
    • 如果有问题的组件是 2 级部件,parent_id 是 1 级组件的 master_id
    • 如果有问题的组件是 3 级部件,parent_id 是 2 级组件的 master_id

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

  • grandparent_id,只有 3 级组件具有(但由于某种原因并非所有 lv3 组件(idk 我没有制作此数据集))。如果组件是 lv3 并且具有grandparent_id,则祖父母 ID 是返回到 lv1 组件的主 ID 的直接链接。是的,很混乱对吧?

所以这里有一个例子。一个 lv3 组件的 master_id 为 700000137,parent_id 为 600000049,grandparent_id 为 500000006。如果我们查看 master 为 600000049 的组件,我们会看到这是一个 lv2 组件,其父 id 为 500000006,它是 lv1 组件的 master 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 做到这一点,我会很感激你解释它。否则,我可能会选择后一条路线。谢谢!

【问题讨论】:

  • 这是关于为 MongoDB 的灵活模式建模的。建模的主要方面之一是使用模式;意思是,您的主要查询是什么以及多久(最常用)?在此基础上,模型将形成。请提供一些有关这些的信息。
  • 需要查询零件吗?
  • @Chev 是的。我们的想法是,我们将每台机器作为主界面上的可点击交互,然后打开一个列出 lv1 部分的视图。单击一个部件可将视图扩展到构成该 lv1 部件的 lv2 部件,并将 lv2 部件的相同功能扩展到 lv3
  • 好的,但你不需要搜索其他机器等有这部分?我问是因为 JSOB 可能很适合这些零件?
  • @Chev 不,它是特定于机器的。就像每台机器都有自己的零件清单一样,无需搜索哪些机器有一组零件。然而,我对实现的考虑越多,我认为 JSON 表示是最好的前进路线,因为我可以通过部分级别做到这一点

标签: database mongodb postgresql


【解决方案1】:

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

只要零件不在多台机器之间共享,这会使在所有机器上更新零件属性变得很棘手,那么您可能就可以了。

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

【讨论】:

  • 没问题,最近做了几百万条记录的测试,在jsonb上搜索真的很好
猜你喜欢
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多