否定简化:Ungood的想法?

时间:2010-05-20 13:21:55

标签: database-design denormalization

在阅读了这篇question后,我发现非规范化并不是简单的解决方案。这个案子怎么样?

我有新闻文章,其中包含一系列网站 - 将要发布的文章。后者可以通过表格和多对多关系(通过交叉表,我认为)以标准化的方式表达。但是简单的解决方案就是为网站 - 将要发布的文章 - (publish_to_site_1,publish_to_site_2等)投入一堆布尔值。假设网站是:

  1. 数量不多
  2. 不会随时间而改变
  3. 除了名称之外,
  4. 本身没有字段

    这仍然是一个糟糕的主意吗?多对多的关系看起来有点麻烦,但我之前就已经这样做了(这看起来很麻烦)。

    注意:我在Rails中这样做,并没有那么痛苦。另一方面,元编程使得这样的事情变得微不足道

    (1..5).each { |site| do_something(article["publish_to_site_#{site}".to_symbol]) }
    

4 个答案:

答案 0 :(得分:3)

如果这些条件真的得到满足,那么不​​,这不是一个糟糕的主意。

实际上,这甚至不是非规范化:非规范化通常意味着您为了性能而冗余地存储一些信息。在您的示例中,由于站点本身没有字段,因此您不会冗余地存储内容。您只是剥夺了将来存储网站其他字段的机会(不违反规范化或重新设计数据库)。

所以,这没关系(规范化):

article                        show_on_stackoverflow    show_on_my_blog
-----------------------------------------------------------------------
Denormalize for Simplicity             YES                     NO
More simplicity                        YES                     YES
...

但这不行(冗余):

article                        show_on_stackoverflow    stackoverflow_mainpage_url   show_on_my_blog    my_blog_mainpage_url
------------------------------------------------------------------------------------------------------------------------------
Denormalize for Simplicity             YES              http://stackoverflow.com            NO          http://my.blog.url       
More simplicity                        YES              http://stackoverflow.com            YES         http://my.blog.url
...

答案 1 :(得分:2)

假设二是不现实的。

因此,完全符合“如果这些条件实际上得到满足,那么不​​,这不是一个可怕的想法。” :是的,这是一个糟糕的主意。

答案 2 :(得分:0)

如果您认为布尔“网站 - 文章将要发布到”仅作为主要数据的属性,例如“isGreen”,“hasHair”,“isBipedal”,那么单个表格会被标准化认为表Green{<true>, <false>}有外键是不正常的。

显然,如果你的3个条件不能继续成立,那么下一个人将会做一些非平凡的工作,但“尽可能简单但不简单”有其实用性。

答案 3 :(得分:0)

就个人而言,我认为我不会反规范化。我认为,如果您熟悉SQL,单个n:n-relation加入并不是那么麻烦。可能麻烦的是将非规范化结构用于不同的查询。例如,您确定自己永远不需要发布文章的所有网站列表......?

并不是说我的方法很糟糕,但我通常更喜欢标准化数据,很乐意再做一次加入:)

干杯 的Matthias