查看多个状态或创建一个表来存储所有状态


see many status or create a table to store all status

我有多个有关系的表。有时我需要做一个连接只是为了检查状态是否 = true 并且查询很大而且有点混乱......

想知道如何在大型项目中处理这种情况。

正在考虑创建一个具有父级和状态的表来对所有条件进行分组 - 在这种情况下,只需要一个简单的查询来检查此关系状态是真还是假。

喜欢这个:

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,那么以前的将不起作用。 然后您可以使用非规范化。将状态字段添加到"表格"表中,并在任何状态发生更改时使其保持最新状态。

如果您想保留数据结构,那么您可以通过删除子查询并改用 join 来优化查询。

在大多数情况下,JOIN 比子查询更快,子查询更快的情况非常罕见。

在JOIN中,RDBMS可以创建一个更适合您的查询的执行计划,并且可以预测应该加载哪些数据进行处理并节省时间,这与子查询不同,子查询将运行所有查询并加载所有数据以进行处理。

子查询的好处是它们比JOIN更具可读性:这就是为什么大多数新SQL人更喜欢它们的原因;这是简单的方法;但是在性能方面,JOINS在大多数情况下更好,即使它们也不难阅读。

你真的没有提供太多信息——甚至没有问一个明确的问题:(

建议:

1) 首先关注您的数据设计

2)确保您的设计允许从数据中查询您需要的任何内容。 例如,如果您需要按日期检查"状态",请确保您有日期时间列。

3)"优化"查询在游戏后期出现。 首先确保您的查询正确,稍后再担心"优化"。

4) 调整数据库(例如,识别和实现索引)至关重要,应始终与 3)

"希望对您有所帮助!

附注:

如果您有具体问题,请务必显示一些示例代码。

相关文章: