sql >> データベース >  >> RDS >> Mysql

DBを正規化する必要がありますか?

    哲学的な答え:次善の(リレーショナル)データベースには、挿入、更新、および削除の異常がたくさんあります。これらはすべて一貫性のないデータにつながり、データ品質が低下します。データの正確性を信頼できない場合、それはどのようなメリットがありますか?これを自問してみてください。正しい答えを遅くしたいですか、それとも間違った答えを速くしたいですか?

    実際問題として:あなたがそれを速く得る前にそれを正しく得なさい。私たち人間は、ボトルネックが発生する場所を予測するのが非常に苦手です。データベースを優れたものにし、適切な期間にわたってパフォーマンスを測定してから、データベースを高速化する必要があるかどうかを判断します。非正規化して精度を犠牲にする前に、他の手法を試してください。より高速なサーバー、接続、データベースドライバーなどを入手できますか?ストアドプロシージャは物事をスピードアップする可能性がありますか?インデックスとそのフィルファクターはどうですか?それらや他のパフォーマンスとチューニングのテクニックがうまくいかない場合は、非正規化を検討してください。次に、パフォーマンスを測定して、「料金を支払った」速度が向上したことを確認します。悲観化ではなく、最適化を実行していることを確認してください。

    [編集]

    A:もちろんです。

    1. バックアップを作成します。
    2. 別のデバイスに別のバックアップを作成します。
    3. 「selectintonewtablefromoldtable...」タイプのコマンドを使用して新しいテーブルを作成します。以前は異なるテーブルを結合するには、いくつかの結合を行う必要があります。
    4. 古いテーブルを削除します。
    5. 新しいテーブルの名前を変更します。

    しかし ...より堅牢なアプローチを検討してください:

    今すぐ完全に正規化されたテーブルにいくつかのビューを作成します。これらのビュー(仮想テーブル、データの「ウィンドウ」...このトピックについて詳しく知りたいかどうかを尋ねる)には、上記の手順3と同じ定義クエリがあります。アプリケーションまたはDB層ロジックを作成するときは、ビューを使用します(少なくとも読み取りアクセスには、更新可能なビューは...まあ、興味深いものです)。次に、後で非正規化する場合は、上記のように新しいテーブルを作成し、ビューを削除し、ビューが何であれ、新しいベーステーブルの名前を変更します。アプリケーション/DBレイヤーは違いを認識しません。

    実際にはこれにはもっと多くのことがありますが、これで始めることができます。



    1. 特定のテーブルとエントリのデータベースダンプを作成するPostgres

    2. IPをデータベースに保存する最良の方法は?

    3. MySql、日付と時刻の列をタイムスタンプに結合

    4. 来週のMicrosoftMVPサミット中にTwitterでフォローしてください