適切な推奨事項であれば、要件をよく理解する必要がありますが、ここで言及したオプションに関するコメントと追加の考えがあります。
1)エンティティ属性値(EAV)デザイン:これは、列名、型、および値の列を持つ表がある場所を記述するオプションです。このオプションには、無制限の新しい列を簡単に収容できるという利点がありますが、意味のあるデータを取り出すときに苦労することがわかりました。たとえば、{Color、varchar} {Red、Green、Blue}、{Size、varchar} {Small、Medium、Large}のEAVテーブルに行があるとします。
SELECT *
FROM ITEMS
WHERE COLOR = 'Green' AND SIZE = 'Small'
:色やサイズのための項目のテーブルの上に実際の列を持つ
SELECT *
FROM ITEMS
WHERE ITEMID IN (SELECT ITEMID
FROM ITEM_ATTRIBUTES ATT INNER JOIN ITEM_VALUES VLS
ON ATT.AttributeID = VLS.AttributeID
WHERE ATT.ColumnName = 'Color' AND VLS.Value = 'Green')
AND ITEMID IN (SELECT ITEMID
FROM ITEM_ATTRIBUTES ATT INNER JOIN ITEM_VALUES VLS
ON ATT.AttributeID = VLS.AttributeID
WHERE ATT.ColumnName = 'Size' AND VLS.Value = 'Small')
コントラストこの:あなたはすべての小さな緑のアイテムを検索したい場合は、この(もちろん、テストされていないSQL)のようなものを必要とします
さらに、データの整合性を維持するのは難しいでしょう(これはこのアプリケーションにとって重要です(ほとんどの場合、特に指示があっても重要です)。上記の例では、「色」を青、緑、赤に限定する必要がある場合は、余分なロジックを実装する必要があります。特定の色だけ特定のサイズに来る場合にも、あなたも、より多くのロジックを実装する必要があります(例 - ブルーのアイテムは、中小でのみ利用可能です)
2)ユーザー定義列:ちょうどユーザーに能力を与えますテーブルに列を追加すると、データの取得が簡単になりますが、データの整合性の問題はすべて残ります。また、あなたのアプリは通常、未知の列を処理するために余分なロジックを必要とします。
3)既存のカスタム列:私はCRMなど、ユーザー定義のために既に十数個以上の列を提供するいくつかのアプリケーションを扱っています。基本的に、デザイナーは "Text1"、 "Text2"、 "Text3"、 "Number1"、 "Number2"などの列に入れます。ユーザーはこれらの列のヘッダーと説明情報を提供します。表示目的。このモデルには、簡単なデータ検索の利点と、事前定義されたDBスキーマがあり、アプリケーションロジックを簡素化することができます。しかし、データの完全性の問題は残っています。もう1つの明らかな欠点は、この種のソリューションでは避けようとしている、あらかじめ定義された列が不足することです。
ほとんどの設計上の問題と同様に、各ソリューションにはトレードオフがあります。私の経験では、多くのユーザー/クライアントは、これらのようなソリューションを望んでいると言いますが、実際には、ニーズに合わせて成長できないアプリにトラップされないようにしています。私は、実際にはこのようなデザインが必要な場所はほとんどないことを発見しました。私はほとんどいつでも、データベースデザイナーの役割を果たすことなく、クライアントの拡大の欲求に対応するデザインを作成することができます。
thougtfulコメントありがとう。追加の列は任意のデータ型にすることができます(ただし、それらのほとんどはリスト項目文字列でなければなりませんが、datetimeなどが可能です)。オプション3)が存在しないように異なる列を定義する必要がある異なるクライアントに適応する必要があります。 – peanut
私はオプション1)と2)の間に躊躇しています。 – peanut