在阅读了这篇question后,我发现非规范化并不是简单的解决方案。这个案子怎么样?
我有新闻文章,其中包含一系列网站 - 将要发布的文章。后者可以通过表格和多对多关系(通过交叉表,我认为)以标准化的方式表达。但是简单的解决方案就是为网站 - 将要发布的文章 - (publish_to_site_1,publish_to_site_2等)投入一堆布尔值。假设网站是:
这仍然是一个糟糕的主意吗?多对多的关系看起来有点麻烦,但我之前就已经这样做了(这看起来很麻烦)。
注意:我在Rails中这样做,并没有那么痛苦。另一方面,元编程使得这样的事情变得微不足道
(1..5).each { |site| do_something(article["publish_to_site_#{site}".to_symbol]) }
答案 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