【发布时间】:2010-11-03 03:23:05
【问题描述】:
在去规范化之前,我想知道这会对以下内容产生什么影响:
- 查询响应时间
- 数据库中的行宽
- 结果所需的联接
- 完成请求所需的查询数
如果我没记错的话,似乎所有这些都会减少?
【问题讨论】:
在去规范化之前,我想知道这会对以下内容产生什么影响:
如果我没记错的话,似乎所有这些都会减少?
【问题讨论】:
除了“with of rows in the database”,你的答案都是正确的。
“非规范化”意味着连续存储比严格必要的信息更多的信息。如果不增加行宽,这是不可能的。
但最重要的是:你没有问所有问题。
您还想知道,如果您故意在数据库中引入重登,那么您是否应该同时引入一些额外的数据库约束,以防止您的数据库包含损坏的数据(自相矛盾的数据)?
如果该问题的答案是“是”,那么也许您还应该问自己,是否强制执行所有那些仅因为您引入了冗余而需要的额外约束,是否不会导致您招致类似的(或更严重的) 更新性能损失。
【讨论】:
如果您碰巧在 Microsoft SQL Server 中工作,我强烈建议您保持表规范化并使用所谓的索引视图进行非规范化。这些是半永久性的数据结构,只要基础表更新,它们就会更新。这样您就可以保持两全其美 - 规范化模式和快速非规范化数据!
Oracle 也可能存在类似的东西,不确定。
【讨论】:
非规范化是一个相当广泛的术语,因此没有快速回答您的问题。
如果您要避免连接,则检索速度可能会更快。但是,您增加了更新和数据维护的复杂性,因此需要进行权衡。
您似乎在询问是否会在整个系统范围内提高查询数量或速度,这也不是完全意义上的 - 最好将其视为针对特定瓶颈的特定局部优化在您的应用程序中,即要考虑使单个查询或一组查询运行得更快。
【讨论】:
数据库中行的宽度不会增加吗?
反规范化只能作为最后手段的优化。
这将增加数据库的大小并增加数据重复,使数据保持最新和同步变得更加困难。
【讨论】:
你的假设是正确的。非规范化会提高性能,但缺点是它会降低正确性。
这个话题已经在之前的stackoverflow question
中详细讨论过了【讨论】: