4

この質問を読んだ後、非正規化は単純化のための解決策ではないことがわかりました。この場合はどうですか?

サイト記事が公開される予定のリストを含むニュース記事があります。後者は、テーブルまたは多対多の関係 (クロステーブルを介して) のいずれかによって正規化された方法で表現できます。しかし、単純な解決策は、sites-article-will-be-published-to (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

仮定 2 は非現実的です。

したがって、「これらの条件が実際に満たされている場合、いや、それはひどい考えではありません」と完全に一致しています。:はい、それはひどい考えです。

于 2010-05-21T22:32:15.783 に答える
0

個人的には、非正規化はしないと思います。私の意見では、SQL に精通している場合、単一の n:n 関係に参加するのはそれほど面倒ではありません。さまざまなクエリに非正規化構造を使用するのは面倒かもしれません。たとえば、記事が公開されているすべてのサイトのリストが必要になることはないと確信していますか?

私があなたのアプローチをひどいと呼ぶことは決してありませんが、私は通常、正規化されたデータを好み、喜んで別の結合を行います:)

乾杯マティアス

于 2010-05-20T13:33:43.717 に答える
0

ブール値の「sites-article-will-be-published-to」を、「isGreen」、「hasHair」、「isBipedal」などのプライマリ データの単なる属性と考えると、単一のテーブルが次の意味で正規化されます。テーブルへの外部キーを持つことは、ひねくれた行為Green{<true>, <false>}です。

明らかに、あなたの 3 つの条件が引き続き当てはまらない場合、次の人は重要な作業を行う必要がありますが、「できるだけ単純に、しかしそれ以上単純にすることはできません」という有用性があります。

于 2010-05-20T13:29:40.803 に答える