1

単純な (関連のない) 値を表す多くのオブジェクトを含む大規模なプロジェクトで作業しています。これらの値は単一の文字列の場合もあれば、2 つの文字列の場合もあり、文字列と整数の場合もあります...

Id現在、リレーショナル データベースに 、CategoryString1String2...、Int1Int2...などの列を含む「値」テーブルがありますDouble1。便利ですが、混乱しています。

すべての値には次のプロパティがあります。

  • 同じ属性を持つすべてのオブジェクトCategoryは、同じ属性を持ちます (つまり、タイプされます)。
  • 関連するオブジェクトはありません (唯一のキーはId主キーです)。

この混乱から抜け出すにはどうすればよいでしょうか。私が見ているように、私たちのオプションは次のとおりです。

  1. 必要に応じて列を追加し続け、テーブルとオブジェクト間のセマンティック マッピングは忘れてください。重ねるだけ。
  2. 値オブジェクトごとに新しいテーブルを作成します。これにより、多数のテーブルがデータベースに追加されますが、そのほとんどは 6 行未満です。これらすべての余分なテーブルがデータベースに追加するノイズが心配です。
  3. これらのオブジェクト専用のスキーマフリー データベースを展開します (展開シナリオでは実際には可能ではありません)。
  4. Idwith 、Category列、および BLOB列のテーブルを作成しValue、値オブジェクトを値列にシリアル化します。これは実行可能ですか?

この投稿では、私たちの選択肢をもう一度述べます。シリアル化を使用する際の注意事項や落とし穴はありますか? 私が知らないオプションはありますか?アドバイス大歓迎です。

4

1 に答える 1

2

別の関連する質問からナビゲートして、これに出くわしました。かなり古いものですが、非常によく説明された問題を提起するだけでなく、データベースの非正規化全体について議論することもできるため、私は興味をそそられて答えました。

データベースを非正規化する理由は数多くあり、言い訳はさらに多くあります。パフォーマンスが最も重要かもしれませんが、データ分類の難しさ (当面の問題など) は間違いなく最も一般的です。さらに、データベースを非正規化する方法は多数あり、その多くは OP によって対処されます。

ただし、実際には、他のすべてが失敗した後、最後の手段としてデータベースを非正規化する必要があります。その理由は次のとおりです。

  • RDBMS だけでなく、人間にとってデータは無意味になります。Integer1何かを保持する可能性のある名前付きフィールドまたはシリアル化された値の目的を理解すること、または覚えておくことさえ困難です。また、RDBMS は、結果を並べ替えたり、集計を適用したりするために、シリアル化されたエンティティから値を抽出することはできません。

  • 不安定なスキーマを維持するのは困難です。データベース スキーマが一定でなければならないのには理由があります。その他、より高いレベルはそれに依存します。スキーマが一晩で変更された場合、新しいステータスを反映するために、アプリケーションも変更する必要があります。さらに悪いことに、ビュー、ストアド プロシージャ、およびその他の依存データベース コンポーネントの保守も同様に困難になります。

  • 制約を適用できず、インデックスを作成できません。シリアル化されたフィールドを外部キーとして定義したり、特定の値のセットに限定したりする意味はありません。これにより、データベースの自己保護メカニズムの大部分がキャンセルされます。データの整合性が低いということは、管理コストが高くなることを意味します。さらに、インデックスはここでも同様に役に立たないため、テーブルが最適化されにくくなります。

  • 最終的に、メタデータは data として保存する必要がありますarticle記事を保持するためのメイン テーブルがある多言語 CMS を想像してみてください。現在、サポートされているすべての言語に対して、翻訳を保持するための対応するarticle_{lang}テーブルがあります (つまりarticle_enarticle_frarticle_esなど)。article記事の既存の翻訳を記録するには、テーブルへの外部キー、言語 ID、翻訳テーブルのテーブル名、および翻訳テーブルの FK であるフィールドを使用して、「関係」テーブルを作成する必要があります。ただし、1 つとして定義することはできません。次に、各記事の利用可能な翻訳をカウントするクエリを作成してみてください!

したがって、可能な限り非正規化を避けてください。エンティティをある程度分類できる場合は、IS-A 関係が答えになる可能性があります。任意の属性をサポートするため、または分類が単に価値がない場合、正規化されたデータを保持するテーブルへの外部キーを持つキーと値のペア テーブルは、十分すぎるほどの犠牲です。

于 2013-10-29T17:44:39.387 に答える