2011-12-15 6 views
3

私は "ブック"で構築しているweb-app用のデータベースを設計しました。非正規化:いくらですか?

  • 、アプリのエンティティを含むER図を作成し、属性、関係
  • 「ノー・スキーマへのスキーマを翻訳スキーマ
  • にしてER図を翻訳:それは私てきたが、あります(データベースはCassandra(NoSQL)データベースです)。

すべてがうまくいっています(これまでのところ)。私は大きな成果で前もって非正規化しましたが、まだ非正規化されていないデータを使用するアプリケーションの一部を実装しています。この特定の部分については、パフォーマンスがいくらか向上することが予測されます(7の代わりに1 Column_Family(リレーショナル・ワールドでは「表」)からの読み取り)。

しかし、私はあまりにも多くの非正規化をしている可能性があることを恐れています。問題の部分でそうする必要がある場合、アプリケーションのColumn_Family/tableの数を約20%削減し、データベースの多くを非正規化することで何らかの理由で神経質になってしまいます。

私はデータベースデザイナーや管理者を迎え入れることができれば十分ですが、私が実行している非正規化が私が求めている(ベストケースの)性能、または少なくとも最も有害ではない(最悪の場合)性能。

非正規化の決定を行う際に注意すべき点がありますか?そうすることは悪いことを示しているのでしょうか?

+6

"正常に動作するまでノーマライズし、正常に動作するまでノーマライズします" - anon。 –

+1

@MitchWheat:その見積もりを検索すると、http://stackoverflow.com/questions/47711/how-do-you-determine-how-far-to-normalize-a-databaseとhttp:// www。 codinghorror.com/blog/2008/07/maybe-normalizing-isnt-normal.htmlどちらも参考になりました。ありがとう! – Kevin

答えて

10

は非常に異なっていますSQLデータベースのためのスキーマを設計するよりも。 SQLデータベースを使用すると、データが1つのマシンに収まるため、データベースは索引を保持し、ジョインを実行し、SQLを使用して複雑な問合せを実行できます。これらはすべて正規化データを実用的にします。

データが1台のマシンに収まらないため、結合を実行できません。効率的に行うことができる唯一のクエリーはキーの列の範囲を取得することです.casandraは限られたインデックスしか保持しません。これにより、データを非正規化することができます。

cassandraでは、通常、作成するクエリを提供するようにスキーマを設計し、それを行うには非正規化します。このの私のお気に入りの一例は、

For example, say someone clicks on a t.co link to blog.example.com/foo at 11:41am on 1st Feb. 
Rainbird would increment counters for: 

t.co click: com (all time) 
t.co click: com.example (all time) 
t.co click: com.example.blog (all time) 
t.co click: com.example.blog /foo (all time) 
t.co click: com (1st Feb 2011) 
t.co click: com.example (1st Feb 2011) 
t.co click: com.example.blog (1st Feb 2011) 
t.co click: com.example.blog /foo (1st Feb 2011) 
t.co click: com (11am-12 on 1st Feb) 
t.co click: com.example (11am-12 on 1st Feb) 
t.co click: com.example.blog (11am-12 on 1st Feb) 
t.co click: com.example.blog /foo (11am-12 on 1st Feb) 
t.co click: com (11:41-42 on 1st Feb) 
t.co click: com.example (11:41-42 on 1st Feb) 
t.co click: com.example.blog (11:41-42 on 1st Feb) 
t.co click: com.example.blog /foo (11:41-42 on 1st Feb) 

この1回のクリックで行うことができる16個のクエリを満たすために16回コピーされ、このpostで説明したようにさえずりがrainbirdのための彼らの統計のために何をするかです。

これはhow to do indexing in cassandraの良いプレゼンテーションです。

1

一般に、許容できるほどの正規化が必要です。特に、大きくなる可能性が高いと思われるテーブルに関しては、私は、非常に小さなデータセットや直接関連するデータの正規化をスキップしましたが、パフォーマンスの理由を改善することは決してありません(これは、レポートサーバーとETLが対象としています)。デザインに余計な努力を払っており、非常に小さく直接的に関連する、まれに変化するテーブルに再参加することは、開発の観点からは時間の無駄です。

私は、データの整合性とスペースの無駄を(ディスクとメモリ上に)順番に非正規化することに大きな懸念を抱いています。

正規化に関する私の懸念は、メンテナンス性です。本当に必要なものよりもはるかに単純なものを作るのは、一般的に無駄です。正規化のための正規化は、私が懸念している限り狂信的であり、Sithの取引だけが絶対的です。

1

パフォーマンスのための非正規化は悪いことではありません。考慮すべきことは、アプリケーション/データベースの目標と、正規化がどのようにそれらを達成するのに役立つかということです。

まず、テーブルを1NFに入れると、冗長なデータや(Coronel、Rob 2009)の "繰り返しグループ"が削除されます。複数の場所(別の表または行)でデータを削除することは良いことであり、保守、データの完全性、およびパフォーマンスの向上に役立ちます。

2NFを取得するには、部分的な依存関係を排除する必要があります。コンポジットキー(複数のキーフィールドで構成されるプライマリキー)とキーの1つまたは一部だけで値が決定されるフィールドがある場合、部分的な依存関係が存在します。通常、部分依存関係を排除することで、多対多の関係を処理するために作成されたブリッジテーブルが表示されるようになります。

3NFは、すべての推移的な依存関係、または非キーフィールドの値に依存するフィールドを排除するという点で、さらに進んだステップです。このステップは、パフォーマンスの名前でしばしば交渉可能なものです。推移的フィールドの値の大きさや分散に応じて、それらの値をテーブルに保持するという課題と、それを取得するためにJOINする必要がある頻度を重み付けする必要があります。

冗長データの排除と依存データ(部分的かつ推移的)は良いことです。しかし、あなたのアプリケーションにとって意味をなさないことをやめさせてはいけません。

C.コロネル、P.ロブ(2009)、 "データベースシステム:デザインのインプリメンテーションおよび管理" カサンドラのスキーマを設計、コーステクノロジー、ボストン、MA(5章)

関連する問題