8

この質問はprogrammers.stackexchangeに適している可能性があります。その場合は、移行してください。

私は現在、典型的なデータモデルの複雑さについて考えています。データモデルを正規化する必要があることは誰もが知っていますが、一方で、正規化されたデータモデルでは、後でデータを再構築するためにかなりの数の結合が必要になります。また、関係するテーブルのサイズによっては、結合は潜在的にコストのかかる操作です。それで、私が理解しようとしている質問は、通常、このトレードオフについてどのように取り組むかということです。つまり、実際には、データモデルを設計するときに、一般的なクエリで許容できる結合の数はいくつですか?これは、単一のクエリで複数の結合をカウントする場合に特に興味深いでしょう。

例として、家を所有し、部屋があり、引き出しがあり、アイテムが入っているユーザーがいるとします。これをユーザー、家、部屋、引き出し、および上記の意味でのアイテムのテーブルで簡単に正規化すると、後で特定のユーザーに属するすべてのアイテムを取得するときに、5つのテーブルを結合する必要があります。これは私には非常に複雑に思えます。

ほとんどの場合、テーブルのサイズも関係します。データが少ない5つのテーブルを結合することは、数百万行の3つのテーブルほど悪くはありません。それとも、この考慮事項は間違っていますか?

4

4 に答える 4

6

データベースの正規化は、それ自体が芸術形式です。
結合を正しく構造化すると、必要な列のみを取得することになります。
複数のテーブルを持つ数百万のレコードを使用してクエリを実行し、必要なフィールドを結合するだけの方が、すべてのレコードを含む1つまたは2つのテーブルがある場合よりもはるかに高速です。2番目の例では、すべてのデータを取得し、それを並べ替えるのはコーディングの悪夢です。
MySQLは、要求されたデータを取得するだけで非常に優れています。
クエリが長いからといって、それが遅いという意味ではありません。
非常に高速な20行をはるかに超えるコードのクエリステートメントを見てきました。

作成するクエリを信頼し、テストスクリプトを作成しない場合は、自分で試してください。

于 2012-06-29T07:13:13.370 に答える
6

データベースの正規化には理由があり、20を超えるテーブルとサブクエリが結合され、長い間正常に機能しているクエリを見てきました。正規化の概念は、これまでの動作部分に影響を与えることなく、既存の動作アプリケーションに追加される新しい機能を導入できるため、大きなメリットであると思います。

データベースには、生活を楽にするさまざまな機能が付属しています。

  • 最も一般的に使用されるクエリのビューを作成できます(ただし、ビューのユースケースはこれだけではありません)。
  • 一部のRDBMSは、共通テーブル式(CTE)を提供します。これにより、名前付きサブクエリと再帰クエリを使用できます。
  • 一部のRDBMSは拡張言語(PL/SQLやPL/pgSQLなど)を提供します。これにより、独自の関数を開発してスキーマの複雑さを隠し、API呼び出しのみを使用してデータを操作できます。

しばらく前に、複数の結合を含むSQLステートメントはどのように機能するのかという質問がありました。それも調べる価値があるかもしれません。

正規化されたデータベースを使用したアプリケーションの開発は簡単です。適切なアプローチを使用すると、ビュー/関数を介してスキーマを分離し、アプリケーションコードをスキーマの変更の影響を受けないようにすることができます。非正規化された設計を採用する場合、非正規化されたシステムは変更の可能性を犠牲にして高度にパフォーマンスが最適化される傾向があるため、設計変更がコードの大部分に影響を与える可能性があります。

于 2012-06-29T07:52:21.340 に答える
4

完全に正規化されたデータモデルは、パフォーマンスのコストが高くなりますが、変更に対する耐性が高くなります。1つのクエリ用に調整された10セント硬貨としてフラットなデータモデルのパフォーマンスははるかに向上しますが、仕様が変更されたときに料金を支払う必要があります。

では、おそらく問題は、データモデル(クエリ)の使用が大きく変わるかどうかということです。そうでない場合; それらを正規化しないでください。特定のクエリに合わせて調整するだけです(DBAに問い合わせてください)。それ以外の場合は正規化し、多くの結合を使用する場合はクエリ実行プランだけで、特定の番号を指定することはできません。

于 2012-06-29T07:11:42.703 に答える
2

あなたの質問を解決するための答えは次のとおりです。

http://en.wikipedia.org/wiki/Database_normalization

非正規化を使用してパフォーマンスが問題になる場合は、これらの問題を解決できます。そのステップを前もって考えることは(すでに期待できる負荷がない限り)行われるべきではありません。本当に必要な場合、測定に基づいて非正規化します。

于 2012-06-29T07:36:16.003 に答える