###@石の心###
私は常に EAV と MVC を使用します。
@ビル?カービン
ここで言及したすべての內(nèi)容:
データ検証
私の意見(jiàn)では、このようにデータベースを使用することは、石で釘を打つようなものです。石を使って行うこともできますが、このアクティビティのために特別に設(shè)計(jì)された、より正確なハンマーを使用すべきではないでしょうか。
この問(wèn)題は、データの一部に対して少數(shù)のクエリを?qū)g行し、それをテーブル レイアウトに処理することで解決できます。 600 GB の商品データがある場(chǎng)合でも、このテーブルから各行のデータを取得する必要がある場(chǎng)合は、バッチで処理できます。
さらに、クエリのパフォーマンスを向上させたい場(chǎng)合は、レポートやグローバル テキスト検索などの特定の操作を選択し、必要なデータを保存し、定期的に (30 分ごとなど) 再生成するインデックス テーブルを準(zhǔn)備できます。
追加のデータ ストレージのコストについて心配する必要もありません。データ ストレージのコストは日々低くなっています。
アプリケーションによって実行される操作のパフォーマンスがまだ心配な場(chǎng)合は、いつでも Erlang、C、Go 言語(yǔ)を使用してデータを前処理し、メイン アプリケーションで最適化されたデータをさらに処理できます。
記述した型階層をモデル化するには、少なくとも次の 5 つのオプションがあります:
単一テーブルの継承: すべてのタイプのすべての屬性を格納するのに十分な列を備えた、すべての製品タイプに対して 1 つのテーブルを使用します。これは、各行に多くの列があり、その行のほとんどが NULL であることを意味します。
クラス テーブルの継承: 製品のテーブルを使用して、すべての製品タイプの共通屬性を保存します。次に、各製品タイプのテーブルを使用して、その製品タイプに固有の屬性を保存します。
特定のテーブルの継承: 共通の製品屬性のテーブルはありません。代わりに、製品タイプごとに 1 つのテーブルを使用して、共通の製品屬性と製品固有の屬性を保存します。
シリアル化された LOB: 製品に対して 1 つのテーブルを使用して、すべての製品タイプの共通屬性を保存します。追加の列には、XML、YAML、JSON、またはその他の形式の半構(gòu)造化データの BLOB が保存されます。この BLOB を使用すると、各製品タイプに固有の屬性を保存できます。ファサードやメメントなど、複雑なデザイン パターンを使用してこのプロセスを記述することができます。ただし、いずれにせよ、SQL で簡(jiǎn)単にクエリできないプロパティ BLOB があるため、BLOB 全體をアプリケーションに返し、そこで並べ替える必要があります。
Entity-Attribute-Value: 製品のテーブルと、屬性を列ではなく行に回転させるテーブルを使用します。 EAV はリレーショナル パラダイムにおいて効率的な設(shè)計(jì)ではありませんが、今でも多くの人が使用しています。これは、別の回答で述べた「プロパティ パターン」です。問(wèn)題點(diǎn)のいくつかについては、StackOverflow で eav タグ を使用した他の質(zhì)問(wèn)を確認(rèn)してください。
これについては、Extensible Data Modeling というデモで詳しく書(shū)きました。
EAV についてのその他の考え: 多くの人は EAV を気に入っているようですが、私はそうではありません。これは最も柔軟なソリューションであるため、最良のソリューションであると思われます。ただし、この格言 TANSTAAFL を思い出してください。 EAV の欠點(diǎn)のいくつかを次に示します:
NOT NULL
と同等)。 JOIN
が必要だからです。 EAV によって提供される柔軟性には他の領(lǐng)域での犠牲が必要となり、元の問(wèn)題を従來(lái)の方法で解決した場(chǎng)合と同じくらい (またはさらに悪化) コードが複雑になる可能性があります。
そして、ほとんどの場(chǎng)合、そのレベルの柔軟性は必要ありません。製品タイプに関するご質(zhì)問(wèn)では、製品固有の屬性を格納するテーブルを製品タイプごとに作成する方が簡(jiǎn)単です。これにより、同じ製品タイプのエントリに対して少なくとも一定の一貫した構(gòu)造を適用できます。
各行 に異なるプロパティのセットを許可する場(chǎng)合にのみ、EAV を使用します。製品タイプのセットが限られている場(chǎng)合、EAV は過(guò)剰です。クラステーブルの継承が私の第一選択です。
JSON 関數(shù) を使用してそれらをサポートしたとしても、クエリは複雑になりすぎます。 JSON ドキュメントを保存するには、通常の行と列に保存するよりも多くのストレージ スペースが必要です。
基本的に、リレーショナル データベースでは、これらのソリューションはどれも簡(jiǎn)単でも効率的でもありません。 「可変特性」を持つという概念全體は、関係理論と根本的に矛盾します。結(jié)局のところ、データのクエリ方法に基づいてこれらのソリューションの 1 つを選択する必要があります。これは、
アプリケーションにとって最も最?lèi)櫎违渐辚濠`ションに基づいています。したがって、データベース設(shè)計(jì)を選択する前に、データをクエリする方法を知っておく必要があります。アプリケーションにとっては、いずれか 1 つのソリューションが最適な選択となる可能性があるため、1 つのソリューションが「最適」ということはありません。