数据库规范化

时间:2011-02-17 19:01:30

标签: sql database-design

我正在构建一个查询,当我构建它时,我意识到如果某些表包含冗余字段会更容易编写;它节省了一些连接。但是,这样做意味着数据库模型不会完全正常化。

我的目标是表现;将使用非规范化数据库会妨碍性能?我正在使用SQL Server。

感谢。

7 个答案:

答案 0 :(得分:1)

在这种情况下,我经常发现你最好的选择是创建一个索引视图,它是规范化表的非规范化版本。这样您就可以轻松查询数据,而不会造成维护噩梦。

有几点需要注意:

  • 如果您正在使用左侧,这将不起作用 加入
  • 这会慢下来 插入/更新/删除功能
  • 它将占用空间(它是持久的)。

Here is an article可以解决索引视图的一些优点。

回答你的问题;具有非规范化结构通常会提高性能但会造成维护噩梦。

答案 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,那么就会好。

答案 2 :(得分:0)

一旦你知道连接导致性能问题,并且升级硬件不是一个选项,那么要么是非规范化的时候,要么处理某些用例(多个用户获得相同的数据,例如网站的主页)开始缓存。

答案 3 :(得分:0)

非正规化通常在标准化后发生,当您遇到问题时,可能还有性能问题。

你没有预先设计它:我几乎可以保证你的假设是错误的,处理以意想不到的方式使用的denormalued架构将是一个痛苦的世界。

例如,Data modification anomalies

而且,也许我在过去的十五年中误解了这一点,但是不是有效地设置JOIN表的数据库引擎吗?

答案 4 :(得分:0)

要回答你的问题,“将有一个非规范化的数据库阻碍性能吗?”,答案是“它取决于”。规范化是约束。它不会提高数据库性能,除非您访问模式使得查询中忽略了大量数据(您的结果集较小)。但是,非标准化可以提高您有很多连接的性能(您有更大的结果集)。

答案 5 :(得分:0)

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

Normal Form中的数据库也有助于减少设计偏差(有偏见的架构意味着设计为比其他类型更适合某些类型的查询)。从这个意义上说,它应该为数据库优化器提供最好的机会来完成它的工作。非规范化意味着添加冗余,在许多情况下,这也意味着相同信息需要更多存储 - 这可能会影响性能。

答案 6 :(得分:-1)

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