gpt4 book ai didi

java - Hibernate、SQL 和递归关联

转载 作者:搜寻专家 更新时间:2023-11-01 03:29:55 24 4
gpt4 key购买 nike

我的数据库有两个表,“question”和“field”。问题可能有很多字段,字段可能有很多字段。它是一棵具有特殊根节点的树。

我想将它们与 hibernate(目前是 potgresql)一起使用 - 因此从 java 中使用它应该简单明了。

最好的解决方案是什么?

  1. 将 question_parent_id 和 field_parent_id 添加到“字段”表,并且仅当它是它的直接后代时才使用 question_parent_id。 (检查 XOR 哪个 SQL 约束...可能取决于 SQL 服务器)
  2. 添加 question_parent_id 和 field_parent_id,并始终使用 question_parent_id。请记住保持一致...(question_id 不应更改,可能不是真正的风险)
  3. 使用 postgresql 特定的表继承:“问题”和“字段”扩展“内容”,因此一个外键列就足够了。对“问题”和“字段”使用附加约束。
  4. 使用第三个表(称为“容器”),仅包含一个 ID。容器可能有很多字段,一个字段可能有一个容器。问题只有一个容器。但这需要 java 中的额外代码,并且有无限循环的风险,即使在 field_container_id 上有一个唯一的键......

最佳答案

我宁愿考虑类模型而不是关系模型。最后的用户(通常)不关心您的数据库中有多少个键。他正在使用您的类(class),它应该“简单易用”。所以先写你的类模型,然后再考虑映射。

数据库中的解决方案取决于您的类模型。

编辑:另一边的模型取决于您需要做什么。

导航:您通常需要问题中的所有字段吗?您通常只需要直接分配给问题或字段的字段,还是递归地沿着树向下分配所有字段?您需要知道字段的父级吗?等等等等

查询:您是否需要按分配给它们的字段来过滤问题或字段?递归地?您需要按 parent 过滤字段吗?等等

换句话说:您无法优化所有内容。有典型的查询和典型的导航路径。支持太多方式可能会变得昂贵,并且可能需要模型和数据库中的冗余数据,这使得维护变得困难。

关于java - Hibernate、SQL 和递归关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3102390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com