java sql关联_java – Hibernate,SQL和递归关联

我的数据库有两个表,“问题”和“字段”.问题可能包含许多字段,字段可能包含许多字段.它是一个具有特殊根节点的树.

我想在hibernate(目前是potgresql)中使用它们 – 所以它应该简单易用,从java中使用它.

这是什么最好的解决方案?

>将question_parent_id和field_parent_id添加到“field”表中,如果它是它的直接后代,则仅使用question_parent_id. (检查XOR哪个SQL约束……可能依赖于SQL服务器)

>添加question_parent_id和field_parent_id,并始终使用question_parent_id.记住保持一致……(question_id不应该改变,可能不是真正的风险)

>使用postgresql特定的表继承:“问题”和“字段”扩展“内容”,因此一个外键列就足够了.在“问题”和“字段”上使用附加约束.

>使用第三个表(称为“容器”),仅包含一个id.容器可能有许多字段,字段可能有一个容器.问题有一个容器.但是这需要在java中使用额外的代码,并且存在无限循环的风险,即使在field_container_id上有一个唯一的密钥……

最佳答案 我宁愿考虑类模型而不是关系模型.最后的用户(通常)不关心数据库中有多少个密钥.他正在使用你的课程,它应该“简单易用”.因此,首先编写您的类模型,然后考虑映射.

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

编辑:您的模型在另一侧取决于您需要做什么.

导航:您通常需要问题中的所有字段吗?您是否通常只需要直接分配给问题或字段的字段或递归到树下的所有字段?你需要知道一个领域的父母吗?等等

查询:您是否需要按分配给他们的字段过滤问题或字段?递归?您需要按父级过滤字段吗?等等

换句话说:你不能优化一切.有典型的查询和典型的导航路径.支持太多方法可能会变得昂贵,并且可能需要模型和数据库中的冗余数据,这使得难以维护.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值