我有多个具有关系的表。 有时我需要进行连接只是为了检查 status = true 并且查询很大并且有点令人困惑......
想知道如何在大型项目中处理这种情况。
正在考虑创建一个包含父项和状态的表来对所有条件进行分组 - 在这种情况下只需要一个简单的查询来检查此关系状态是 true 还是 false。
像这样:
select *
from table
where table.parent in (select id from tableB where status = 1)
or table.parent in (select id from tableC where status = 1)
or table.parent in (select id from tableD where status = 1)
这是一个好方法吗? 从未测试过,不知道它在多大程度上可以成为最佳解决方案
谢谢
最佳答案
我有点困惑。您想重新设计您的数据结构,还是想优化您的查询?
如果没有明确的规范,我无法提供优化的数据结构。尽管这里是基于一些假设的一些优化建议。
- 如果您的父 ID 在表格之间不重叠(即 tableb、tablec、tabled 没有共同的 ID),您可以将状态字段移至您的'table'表格。
- 如果他们共享一些 ID,那么以前的方法将不起作用。那么你可以使用Denormalization 。将状态字段添加到'table'表中,并在任何状态发生更改时保持最新状态。
如果您想保留数据结构,那么您可以通过删除子查询并使用联接来优化查询。
在大多数情况下,JOIN 比子查询更快,而子查询更快的情况很少。
在 JOIN 中,RDBMS 可以创建一个更适合您的查询的执行计划,并且可以预测应该加载哪些数据进行处理并节省时间,这与子查询不同,子查询将运行所有查询并将所有数据加载到进行处理。
子查询的好处是它们比 JOIN 更具可读性:这就是为什么大多数 SQL 新人更喜欢它们;这是最简单的方法;但就性能而言,JOINS 在大多数情况下更好,尽管它们也不难阅读。
关于php - 查看许多状态或创建一个表来存储所有状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22752596/