为了节省一些复杂的查询,重复数据库中的字段是不好的设计实践吗?

时间:2011-03-28 09:11:29

标签: database-design relational-database

如果您有一些连接表包含您需要的所有信息,但它涉及一些复杂的连接等。最好在你选择的表中添加一个额外的字段以节省这些额外的查询吗?

提前致谢

2 个答案:

答案 0 :(得分:4)

是和否。

这是故意违反数据库规范化的原则,因此被称为“非规范化”。

它的不足之处几乎是我们规范化的所有原因,最明显的是它引入了一种错误可以使数据库与自身不一致的方式。因此,一般来说,DB设计很糟糕。在实践中,它还使数据库的更新变得更复杂,因此更加昂贵(并且假设没有错误)。

它可以为某些查询带来性能优势,这些查询总是超时和微不足道。因此,这是一种合理的,有时是必要的优化。

我喜欢采取以下方法:

  1. 双重思考其必要性。特别是,CTE已经做了一些我不再需要采用这种技术的案例,因为CTE可以做一些曾经需要多次查表的东西(事实上,我过去使用它的大多数情况) 。有时候,所有真正需要的是彻底检查所涉及的指数。最后,值得尝试通过使用这种非规范化优化的查询,而不是一次又一次地使用它;各种变化都可以消除对它的需求。

  2. 为相关数据创建一个单独的表,将其视为不被视为主要设计一部分的“查找”,向其他开发人员强调,这是一种优化,而不仅仅是糟糕的数据库设计。如果错误导致上述不一致,这也可以更容易地重建整个事物。

  3. 使用触发器维护表,以便对其所依赖的表进行更新将自动保持正确,而不必在更新时引入有关维护它的特殊规则(这些规则几乎肯定会被破坏,或者至少导致代码不太明确。)

答案 1 :(得分:2)

我实际上已经看到了这种情况,虽然如果它是一个好的设计实践我会怀疑,似乎它有时会提供一些好的表现。特别是我在Rails中看到它作为计数器缓存,其中出现了一个新字段以保持计数。我想如果你有太多的条目,它可以真正产生一些更好的性能。