我的数据库有两个表,“问题”和“字段”.问题可能包含许多字段,字段可能包含许多字段.它是一个具有特殊根节点的树.我想在hibernate(目前是potgresql)中使用它们 – 所以它应该简单易用,从java中使用它.这是什么最好...
我的数据库有两个表,“问题”和“字段”.问题可能包含许多字段,字段可能包含许多字段.它是一个具有特殊根节点的树.
我想在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上有一个唯一的密钥……
解决方法:
我宁愿考虑类模型而不是关系模型.最后的用户(通常)不关心数据库中有多少个密钥.他正在使用你的课程,它应该“简单易用”.因此,首先编写您的类模型,然后考虑映射.
数据库中的解决方案取决于您的类模型.
编辑:您的模型在另一侧取决于您需要做什么.
导航:您通常需要问题中的所有字段吗?您是否通常只需要直接分配给问题或字段的字段或递归到树下的所有字段?你需要知道一个领域的父母吗?等等
查询:您是否需要按分配给他们的字段过滤问题或字段?递归?您需要按父级过滤字段吗?等等
换句话说:你不能优化一切.有典型的查询和典型的导航路径.支持太多方法可能会变得昂贵,并且可能需要模型和数据库中的冗余数据,这使得难以维护.
本文标题为:java – Hibernate,SQL和递归关联
基础教程推荐
- SpringBoot使用Caffeine实现缓存的示例代码 2023-02-11
- SpringBoot详解如果通过@Value注解给静态变量注入值 2023-01-13
- SpringBoot中Tomcat和SpringMVC整合源码分析 2023-03-16
- 一文带你深入剖析Java线程池的前世今生 2023-06-17
- Spring Boot 防止接口恶意刷新和暴力请求的实现 2022-12-03
- Intellij IDEA 的maven项目通过Java代码实现Jetty的Http服务器(推荐) 2023-02-19
- Java利用Easyexcel导出excel表格的示例代码 2023-03-06
- @RequestBody注解Ajax post json List集合数据请求400/415的处理 2023-06-30
- Java循环结构之多重循环及continue break 2023-05-14
- 关于mybatisPlus yml配置方式 2022-11-29