数据库规范化

3
我正在构建一个查询,随着构建的进行,我意识到如果一些表包含冗余字段,编写查询会更容易;这将节省一些连接操作。然而,这样做意味着数据库模型不是完全规范化的。
我追求性能;数据库去规范化是否会影响性能?我使用SQL Server。
谢谢。

为什么少做联接更“容易”?您是否在组合正确的联接时遇到了困难?还是您担心性能方面的问题? - Walter Mitty
7个回答

1
在这种情况下,我经常发现最好的选择是创建索引视图,它是规范化表的非规范化版本。这样可以轻松查询数据,同时不会创建维护难题。
需要注意以下几点:
  • 如果使用左连接,则不起作用
  • 会减慢插入/更新/删除操作的速度
  • 它会占用空间(持久性)。

这里有一篇文章介绍了索引视图的一些好处。

回答你的问题:采用非规范化结构通常会提高性能,但会创建维护难题。

1

我不知道你的具体实现是什么,但通常有冗余的索引引用会有所帮助,但不是冗余字段本身。

例如,假设你有三个表:tbl_building、tbl_room和tbl_equipment。(一件设备属于一个房间,该房间属于一个建筑)

tbl_building有一个buildingID,tbl_room有一个roomID和对buildingID的引用。如果tbl_equipment有对roomID和buildingID两者都的引用,那么它将为你节省一个连接,即使你可以从roomID推断出buildingID。

现在,如果例如,在tbl_building上有buildingSize字段,并将该buildingSize字段复制到tbl_room和tbl_equipment上,那就不好了


0

一旦你确认连接操作引起了性能问题,并且升级硬件不是一个选择,那么要么是时候去反规范化,要么是开始缓存来处理特定的使用情况(例如多个用户获取相同的数据,比如网站的主页)。


0

反规范化通常在规范化后发生,当您遇到问题时,也许是性能问题。

您不能提前设计它:我可以几乎保证您的假设是错误的,并且处理以意想不到的方式使用的非规范化模式将带来痛苦。

例如,数据修改异常

而且,也许过去15年我误解了这一点,但难道数据库引擎不是为了有效地连接表而设计的吗?


也许我在过去的十五年中误解了一些东西... 你雇了一个笑话作家 @gbn? :) - Abe Miessler
1
@Abe Miessler:不,这都是我自己的工作。也许我应该继续针织。 - gbn

0
回答你的问题,“非规范化数据库会影响性能吗?”,答案是“这要看情况”。规范化是一种约束条件。它不会提高数据库性能,除非你的访问模式使得在查询中忽略了大量数据(即你有较小的结果集)。但是,在存在许多连接(即你有更大的结果集)的情况下,非规范化可以提高性能。

0

规范化并不决定性能。规范化是关于正确性和防止某些数据完整性问题的。

符合规范形式的数据库也有助于减少设计偏见(偏见模式意味着为某些类型的查询而设计)。在这个意义上,它应该给数据库优化器最好的机会来完成它的工作。非规范化意味着添加冗余,在许多情况下,这也意味着需要更多的存储空间来存储相同的信息-可能影响性能。


-1
规范化的基本目的是减少表中数据的冗余,从而减少存储浪费和不一致性。就性能而言,它取决于您的数据库设计方式。如果存在太多冗余,则在关系中检查和搜索元素将增加搜索时间并降低效率。另一方面,如果冗余较少,则对性能影响不大。但始终最好具有规范化的模式。

说一个规范化的模式总是更好是不正确的。有许多原因可以对数据进行反规范化处理。 - Andrew Barber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接