一个非常复杂的需求,如何设计表结构

2021-03-31 00:51:53 +08:00
 SelectLanguage

某一个类型 A 关系可以表示为一颗树,即 A1 可能有 A2,A3 两个子节点,A2 有 A4,A5,A6 等多个子节点…… 这棵树深度最高大概在 10 左右,整棵树的节点数量在 200W 左右,其中 180W 左右是叶子节点 需求 1: 给定某个节点,能迅速查找出所有子节点,且移动某个子节点到另一个节点下时,所有数据能快速变化 需求 2: 每个叶子节点能生成 0~100 个左右的类型 B,求已知某个 A 的节点后找出 A 下所有的叶子节生成的 B

关于需求 1:现在的做法因为树的层级不高,所以可以把父节点全部保存,比如某个节点 A100 算出他的父级是 A99,A96,A70,A4 直接存到库中,这样坏处就是移动的时候必须批量大量的修改表,不过目前时间上还是能够满足

关于需求 2:这个目前难住了,原本的做法是从树中每次先找出一部分叶子节点计算(比如先找 A 的前 10 个叶子节点计算所有的 B,然后再找 11~20 个叶子节点计算所有的 B……),但是现在的需求是 B 要按时间排序,因为之前每次只找了一部分所以排序肯定是不准的,如果想像需求 1 一样记录父级节点,又因为 B 的量级可能是 A 的十倍以上,修改节点的时候会非常慢,所以现在没什么思路了,困扰了好几天,求救

5495 次点击
所在节点    Java
35 条回复
jorneyr
2021-03-31 12:47:08 +08:00
可以试试存储路径的前缀,用 like 就可以查询出所有后代
baibaibaibai
2021-03-31 13:07:04 +08:00
拆分功能点
hjosama
2021-03-31 14:51:51 +08:00
好复杂的需求呀,完全没有头绪。。。只会根据感觉建表
liian2019
2021-03-31 15:14:01 +08:00
之前我弄过类似的,但是树没有 10 层这么深。假设每一层的节点都不超过 100 个,顶级节点 A 的 NODE ID=99,那 A 的子节点的 NODE ID 就是 9901,9902 这样递增的,9901 的子节点就是 990101 这样的。然后要查某一个节点的子节点只要 NODE_ID like '99%'。要移动节点的话也只要改一下 NODE_ID
buliugu
2021-03-31 17:23:50 +08:00
为什么不试试图数据库呢
luozic
2021-03-31 17:38:48 +08:00
这建模有问题否?关系数据库性能大部分都是写少读多。
dongya
2021-03-31 17:47:26 +08:00
看看这种, 不知道你的表会不会炸,https://www.cnblogs.com/wade-luffy/p/7728934.html
iseki
2021-03-31 19:23:20 +08:00
@x66 “只”😮
iseki
2021-03-31 19:29:28 +08:00
感觉需求 2 唯一舒服的办法是堆内存了,把带路径的元数据全堆内存里,可即便是这样父级节点修改时依然会有大量修改操作🤔
kaneg
2021-03-31 20:00:37 +08:00
这不就是文件系统吗?可以研究下主流的文件系统是如何解决这些问题的。
HankSmash
2021-03-31 23:02:36 +08:00
可能算是题外话但是看到你这这俩需求,第一反应就是上 Graph DB
snoopyhai
2021-04-01 08:21:27 +08:00
有更专业的, 就不要为难 sql 了, 丢给 neo4j 不好么?
cassidyhere
2021-04-01 10:39:30 +08:00
能用 nosql 吗
lafuerza
2021-04-01 10:53:48 +08:00
NewConn
2021-04-01 11:15:45 +08:00
需求 1:
每个节点都存储父节点主键 parent_id 和节点路径 id_path,使用 start with…connect by…prior 可以将某个节点的所有子节点都查出来;
难点在修改时,最好使用一个触发器同时修改子节点

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/766687

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX