私は、製品ごとに異なる可能な属性の束を持つ製品の束を持っています。たとえば、製品Aには名前、サイズ、色、形があります。製品Bには、名前、カロリー、砂糖などがあります。これを解決する1つの方法は、次のとおりです。
1)テーブルを作成する
Products (id, name)
Attributes (id, name)
Product_Attributes (product_id, attribute_id, value as string)
これにより最大限の柔軟性が得られますが、理由はわかりませんが、多くの人がこれに反対することを勧めていると聞いています。つまり、これらのテーブルがTeams、Players、Team_Playersと呼ばれる場合、これが適切なリレーショナル設計であることに同意します。
これがなぜ悪いのかを私に説明する人は誰でも、基本的ないくつかの基本的な初期テーブル(object、attribute、object_attributeなど)を超えて実際のテーブルを作成することがない、完全に柔軟なリレーショナル設計のコンテキストでそうします。すべてが同意できるのは悪いことです。ただし、これははるかに限定されたバージョンであり(システム内のすべてのオブジェクトではなく、製品のみ)、これら2つのアーキテクチャをグループ化することは公平ではないと思います。
この設計を非常に悪くする原因となる問題(経験または理論)は何ですか?
2)これを解決する別の方法は、サイズ、色、形状、重量、砂糖などの列の束を含むProductテーブルを作成し、柔軟性を持たせるために最後にいくつかの追加の列を含めることです。これにより、ほとんどがNULLで満たされた一般的にまばらな行が作成されます。人々はこのアプローチを好む傾向がありますが、私の質問は、このアプローチがパフォーマンス上の利点を失う前に、いくつの列を持つことができるかということです。200の列がある場合、これはもはや賢明な動きではないと思いますが、100の列はどうでしょうか。50列?25列?
3)私が知っている最後のアプローチは、すべての属性をblob(おそらくJSON)としてProductsテーブルの単一の列に格納することです。私はこのアプローチが好きですが、それは正しく感じられません。クエリは難しいです。また、後で属性の名前を簡単に変更できるようにする場合は、すべてのレコードを個別に解析するか、IDを使用してBLOBにキーを設定する必要があります。idパスに移動すると、別のテーブル属性が必要になります。属性を上からアプローチ#1のように見せ始めますが、attribute_idをblobに結合できないため、何もクエリしたくないと思います。属性名で。
このアプローチで私が気に入っているのは、1つの製品にクエリを実行でき、コード内でその製品が持つすべてのプロパティに簡単にアクセスできることです。また、製品を削除しても、他のテーブルをクリーンアップする必要はありません。一貫性を保つのは簡単です。
4)いくつかのRDBMSで強く型付けされたxml形式にインデックスを付けることができることについていくつか読んだことがありますが、正直なところ、このアプローチについてはよくわかりません。
ハマった。アプローチ#1が最善の策だと思いますが、私が読んだすべてのことは、そのように悪臭を放っています。与えられた状況に最適な方法を決定できるように、この問題について考える正しい方法は何ですか?私がリストしたものよりも多くのアイデアが明らかに歓迎されています!