私たちはSQL Server 2008を使用しています。要件の1つは、システムに対して定義されたエンティティの拡張可能なユーザー定義属性を持つことです。たとえば、Doctorというエンティティがあるとします。システムの管理者が通常はシステムにない追加の属性を定義できるようにします。これらの属性は、親テーブルまたは結合テーブルをリンクするクエリ条件として必要になる可能性が最も高いです。拡張可能なデータベーススキーマ - 拡張可能な属性値を格納する方法
属性(名前、説明、タイプ)などを定義するテーブルがありますが、私の質問は実際のデータ値の格納にあります。
イムないDBA(1をふりだけのプログラマ)が、私の最初の考えは
nvarchar(450)
これは基本的なタイプのほとんどをカバーし、まだ可能になるように、1つの汎用の列に保存することでした私は変換の種類の問題(日付、数値などに変換する)だけでなく、すべてがnvarcharなので、異常なクエリの問題に遭遇すると思った。
だから、私の最新の考え方は、私たちがサポートする各データ型の列を作成することです:
ColNVarCharData
nvarchar(450)
ColBitData
bit
ColIntData
int
..Andなど
ユーザーが拡張属性を定義したとき、彼らは選ぶだろうその型のその列に属性値を格納します。たとえば、intを選択した場合、データ値はColIntDataに格納され、他の2つの列はこの例ではnullになります。
これは、各属性をジェネリック型として格納するのではなく、変換の問題を解決すると考えています。さらに、使用されているクエリに応じて、各タイプの必要に応じてインデックスを追加できます。
私はこれを使用する方に傾いていますが、他に誰かの提案があるかどうか疑問に思っています。私はXMLデータ型を細かく見てきましたが、「スキーマ」が頻繁に変更される可能性があるため、これはより適切だと思いました。
参照テーブルからデータ型を検索する必要があるため、属性ID – JNK
これは「EAV」プロポーザルです。代替案については、http://en.wikipedia.org/wiki/Entity-attribute-value_modelを参照してください。これは通常、SQLのアンチパターンです。あなたのクライアントベースを考えれば、確かにあなたはモデルの前面を掴むことができます... – gbn
@gbn、リンクありがとう、それはよく読まれました。はい、私たちはモデルの大部分を取り込むことができます。これは、保守作業の必要性を減らすために、システムが設置された後に追加されたアウトライヤーまたは新しいデータポイントが対象となります。 –