为什么没有人在关系数据库树结构中的节点上存储 child 个 ID 数组?
Why does no one store an array of child ids on nodes in a relational db tree structure?
我正在开发一个业余爱好项目,它是一个嵌套的待办事项列表应用程序。
我从每个节点上的 tree view example in the Redux repository (Javascript project), which uses a data structure which stores an array of child ids 开始。起初我觉得这很奇怪,但是玩了一段时间这个结构,我觉得它很容易维护和推理。
现在我正在研究使用 PostgreSQL 保存待办事项的最佳方法。我已经广泛阅读了每个解决方案的优缺点 here (What are the options for storing hierarchical data in a relational database?),并且即将决定使用 CTE 进行递归,因为在我的应用程序中写入和更新优先于读取,但我想我应该问.. 为什么在 parent 上存储 child id 不是关系数据库的流行解决方案是有原因的吗?
它与 Adjacency List 方法最相似,但递归较少,并且您可以进行排序(通过维护 child_ids
数组中的顺序)。这似乎也更容易推理,因为您不需要在请求 'top down' 树时逆向思考 parents。
我已经有了使用此结构在 Javascript 中交互式 move/update/etc 节点的逻辑,所以如果我可以使用相同的逻辑来持久化数据,那将是一个巨大的胜利。
is there a reason why storing child ids on the parent is not a popular solution for relational DB's
这个想法很流行,有两个注意事项,并且在特定的建模场景下:
- 由于数据库字段存储单个 "thing",因此存储列表 "on the parent" 意味着将列表存储在与 parent ID 相关的单独 table 中,和
- 由于单个 child 可以属于多个 parent,执行 "one parent per child" 政策变得更加困难。
实际上,DB 在 parent 端存储 child ID 的模型不会在任何人端存储 ID,因为您可以检索 parent 个 child 的 ID ] 与检索 parent 的 children 一样容易。这就是为什么在建模 many-to-many 关系时使用这种方法的原因。
注意: 因为当您将 parent ID 存储在 child 上时,每个 child 策略都会自动执行一个 parent ,您可以像这样轻松地对树建模,同时将 in-memory 表示形式转换为树的邻接列表。
我正在开发一个业余爱好项目,它是一个嵌套的待办事项列表应用程序。
我从每个节点上的 tree view example in the Redux repository (Javascript project), which uses a data structure which stores an array of child ids 开始。起初我觉得这很奇怪,但是玩了一段时间这个结构,我觉得它很容易维护和推理。
现在我正在研究使用 PostgreSQL 保存待办事项的最佳方法。我已经广泛阅读了每个解决方案的优缺点 here (What are the options for storing hierarchical data in a relational database?),并且即将决定使用 CTE 进行递归,因为在我的应用程序中写入和更新优先于读取,但我想我应该问.. 为什么在 parent 上存储 child id 不是关系数据库的流行解决方案是有原因的吗?
它与 Adjacency List 方法最相似,但递归较少,并且您可以进行排序(通过维护 child_ids
数组中的顺序)。这似乎也更容易推理,因为您不需要在请求 'top down' 树时逆向思考 parents。
我已经有了使用此结构在 Javascript 中交互式 move/update/etc 节点的逻辑,所以如果我可以使用相同的逻辑来持久化数据,那将是一个巨大的胜利。
is there a reason why storing child ids on the parent is not a popular solution for relational DB's
这个想法很流行,有两个注意事项,并且在特定的建模场景下:
- 由于数据库字段存储单个 "thing",因此存储列表 "on the parent" 意味着将列表存储在与 parent ID 相关的单独 table 中,和
- 由于单个 child 可以属于多个 parent,执行 "one parent per child" 政策变得更加困难。
实际上,DB 在 parent 端存储 child ID 的模型不会在任何人端存储 ID,因为您可以检索 parent 个 child 的 ID ] 与检索 parent 的 children 一样容易。这就是为什么在建模 many-to-many 关系时使用这种方法的原因。
注意: 因为当您将 parent ID 存储在 child 上时,每个 child 策略都会自动执行一个 parent ,您可以像这样轻松地对树建模,同时将 in-memory 表示形式转换为树的邻接列表。