4

阅读此问题后,我了解到非规范化不是简单的解决方案。这个案子怎么办?

我有新闻文章,其中包含网站文章将发布到的列表。后者可以通过表和多对多关系(我认为通过交叉表)以标准化方式表示。但简单的解决方案是只为站点文章将被发布到(publish_to_site_1、publish_to_site_2 等)添加一堆布尔值。假设站点是:

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

这仍然是一个可怕的想法吗?多对多的关系似乎有些麻烦,但我以前在这种情况下做过(而且看起来很麻烦)。

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

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

4 回答 4

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
...
于 2010-05-20T13:26:57.933 回答
2

假设二是不现实的。

因此,完全按照“如果这些条件真的满足,那么不​​,这不是一个可怕的想法”。: 是的,这是一个糟糕的主意。

于 2010-05-21T22:32:15.783 回答
0

如果您认为布尔值“sites-article-will-be-published-to”仅仅是主要数据的属性,例如“isGreen”、“hasHair”、“isBipedal”,那么单个表在某种意义上是规范化的有一个表的外键是不正当的Green{<true>, <false>}

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

于 2010-05-20T13:29:40.803 回答
0

就个人而言,我认为我不会非规范化。我认为,如果您熟悉 SQL,则加入单个 n:n 关系并不是那么麻烦。可能很麻烦的是对不同的查询使用非规范化结构。例如,您确定永远不需要文章发布到的所有站点的列表...?

并不是说我曾经称您的方法很糟糕,但我通常更喜欢标准化数据,很高兴地进行另一个联接:)

干杯马蒂亚斯

于 2010-05-20T13:33:43.717 回答