たとえば、冗長な列を1つのテーブルに格納すると、ランタイムSQLクエリで5つのテーブルを結合することを回避できます。このような場合、冗長データを保存することは正当ですか?私の理解では、これは正規化のルールに違反していますが、私はデータベースの専門家ではありません。
アドバイスありがとうございます。
4 に答える
私の経験では、パフォーマンスの非正規化自体は悪ではありませんが、最初の3NF設計に対して実行するクエリを最適化して、妥当なタイミングを提供できないことを最初に確認する必要があります。
これは、結合数の削減が非正規化の一般的な(そして適切な)理由であることを示唆する素晴らしい記事へのリンクです。
私は正規化ルールを一度だけ破ったとだけ言います(私は知っています:-|)そしてそれ以来それを後悔しています。速度は約15%向上しましたが、システムにあらゆる種類の追加のメンテナンスコードと脆弱性が追加されました。
インデックス作成を改善したり、DBMSにクエリプランを事前に定義する機会を与えたり(つまり、DBMSに必要なものは何でも)、結合を高速化できないかどうかを調べます。
はい、正規化ルールに違反しています。
しかし、あなたは大きな男の子です。ルールと、ルールを破るのが適切な時期を知っておく必要があります。
5つのテーブルは多くありません。正規化によってアプリが破損し、非正規化によって修正されることを伝えるために、どのようなデータが必要ですか?(どちらの方法でも推測できません。)
クエリ速度は、JOINだけでなく、インデックス作成、WHERE句などの影響を受けます。
正規化ルールには、特定の利点とコストが伴います。そのルートに行く前に、何を諦めているのかを知っておく必要があります。
それは確かに第3正規形(3NF)に違反しています。ただし、パフォーマンスを優先して、正当化できる場合もあります。データベースの使用統計を収集し、そのクエリに時間がかかりすぎていないか、または非常に頻繁に使用されているかどうかを確認し、非正規化がシステムに役立つかどうかを確認します。
明らかに、この非正規化された構造では、他の潜在的な問題に対処する必要があります。たとえば、冗長列と他の5つのテーブルに格納されている列の間の一貫性を維持する必要があります。
また、データを挿入するときは、非正規化テーブルと他の元のテーブルの2つの異なる場所にデータを保存する必要があります。