1

可以说我有以下DB结构:
Normalized DB structure
和我的应用程序需要显示的文章列表的所有细节(型号,产品系列,品牌,生产商)。为此,我需要做更多JOIN来获得所需的数据。数据库设计和性能:使用冗余FK提高性能可以吗?

那是正确的,如果我增加创建冗余FKS的文章表像跟踪应用程序的性能?它实际上是否会提高性能?
DB structure with redundant FKs

+0

我不明白怎么会减少连接的数量。您仍然需要连接所有表以获取所有详细信息,但只有连接*顺序*会有所不同(除非您仅对**有兴趣,而对详细表中的其他列不感兴趣) – 2012-08-17 10:42:21

+0

您为什么认为这样会提高应用程序的性能? – 2012-08-17 11:01:16

+0

您可能是正确的,当我需要获取所有数据时,我不会通过多余的FK来提高性能。 – radosdesign 2012-08-17 11:18:49

回答

1

当然可以提高性能,如果你不想要检索的层次结构“中间”对象的任何数据的方式。这是非规范化的常见形式。请注意,你必须要小心不要让矛盾在下滑。

我通常设置一个验证非规范化的数据,邮件错误,我夜间任务,并自动修复它们。这不难做到,并消除了一个令人讨厌的错误类。

人们做的一个不同的原因是分区所有表在同一个键上。

+0

感谢这有助于。我的观点是,不是每次我需要所有的信息。 – radosdesign 2012-08-17 11:15:24

0

找出设计是否提高性能的最佳方法是尝试一下;第二个最好的方法是思考你可能需要运行的查询,然后尝试在你的脑海中建模。不知道你想要运行什么查询,或者数据库有多大,很难知道你是否会看到性能改进。

非常笼统,我说你不会看到对性能产生可衡量的影响,除非你有非常大的数据库(假设你体面的硬件上运行这一点,你已经调整了索引) 。通过“非常大”,我在几个表格中思考数百万行。

如果你真的需要反规范化,我的建议是建立一个明确的非规范化表,而不是“污染”你的常规设计,多余的按键。理解一个被分解为“应该如何”和“妥协”的设计,而不是将两者混合在一起,会更容易理解。

为了实现这个目标,我想创建一个单独的表 - “cached_articles”也许,与列:

article_id 
...(article data) 
model_id 
....(model data) 
family_id 
...(family data) 
brand_id 
....(brand data) 
producer_id 
....(producer data) 

您可以通过批处理作业或触发器保持此表。您只应将应用程序代码写入规范化表,并且只在需要时才从缓存表中读取。

你也应该建立一个强大的“一致性检查”机制来识别可能导致应用程序打破数据的问题;这些一致性检查成为一个大问题,一旦你的数据库增大到这种设计是必需的,因为他们遇到同样的性能问题的大小...

+0

感谢您的回答。它绝对有趣的解决方案,但这会给应用程序带来更多的复杂性(为同步添加cron作业),而当我从“缓存”表中读取时,我不会获得对我来说最新的最新数据。 – radosdesign 2012-08-17 11:53:29

+0

如果最新日期很重要,可以使用触发器更新表;我不喜欢触发器,因为它们倾向于创建难以识别的错误,但它们对于这类事情是理想的... – 2012-08-17 12:06:35