2009-07-27 13 views
6

ユーザーにカスタムフィールドを追加する必要がある複数のエンティティがあります。私は、{名前、dateOfBirthの、StoreId} と{名前}とストアと呼ばれる別の1のような基本変数を顧客と呼ばれるエンティティを持っていた場合、その店舗の所有者がログインできるようにSQL Server 2008のカスタムフィールド

その後

私はそれを望みます好みの色と呼ばれるすべての顧客に新しい変数を追加します。これはオプションとして赤、緑、または青のドロップダウンです。

今、私はEAVを見ていたし、この

属性{StoreId、名前、データ型}のようになります。解決策が出ている、 値{AttributeId、エンティティ名、実体識別子、値}

私は、この情報を簡単に表示して照会できるようにするために、特にSQL Server 2008のために最適なソリューションがあるのだろうかと思っています。

xmlデータ型内でクエリを実行できると聞いています。それは良い方法ですか?

また、ある時点で外部キーであるカスタムフィールドを追加できるようにしたいと考えています。

これは一日中見ていますので、すぐに質問します。

答えて

4

EAVは一般に、パフォーマンスが低下し、スケーラビリティが低下するアンチパターンです。 EAVに参加することを決定した場合、SQL Serverカスタマーアドバイザリーチームは一般的な落とし穴や問題点を持つホワイトペーパーを公開しています。回避方法はBest Practices for Semantic Data Modeling for Performance and Scalabilityです。

SQLでXMLデータ型を照会することはできますが、XMLにスキーマがない場合は照会するのが遅くなります。スキーマがあり、スキーマがEAVの場合、リレーショナルEAVの問題とXMLパフォーマンスの問題の両方が発生します。もう一度CATチームの仲間たちが、このトピックに関するホワイトペーパーを投稿した:XML Best Practices for Microsoft SQL Server 2005Performance Optimizations for the XML Data Type in SQL Server 2005。これらはSQL 2008でも有効です。

2

私はしばらくの間、SQL 2005/2008のXML機能を使用してきました。私はかなりのXML列に依存するようになりました。 あなたがしたいことは、XMLの完璧な候補のように聞こえます。 たとえば、次のスニペットでは、2つのエンティティ(@customersと@stores)を定義し、 "attrs"という列を展開して、より多くの属性を含めることができます。 私はこれが助けてくれることを願っています!

declare @customers as table (id int, attrs xml); 
INSERT INTO @customers VALUES 
    (1,'<Attrs Name="Peter" DateOfBirth="1996-01-25" StoreId="10" />'), 
    (2,'<Attrs Name="Smith" DateOfBirth="1993-05-02" StoreId="20" />') 
; 
declare @stores as table (id int, attrs xml); 
insert into @stores VALUES 
    (10, '<Attrs Name="Store1" />'), 
    (20, '<Attrs Name="Store2" />') 
; 
With c as (
    select id as CustomerID, 
     attrs.value('(/Attrs[1])/@Name', 'nvarchar(100)') as Name, 
     attrs.value('(/Attrs[1])/@DateOfBirth', 'date') as DateOfBirth, 
     attrs.value('(/Attrs[1])/@StoreId', 'int') as StoreId 
    from @customers 
), s as (
    select id as StoreID, 
     attrs.value('(/Attrs[1])/@Name', 'nvarchar(100)') as Name 
    from @stores 
) 
select * 
from c left outer join s on (c.StoreId=s.StoreID); 
1

優れた回答が既にあります。カスタムフィールドのメタデータを維持するという提案だけを追加します。これにより、カスタムフィールドを簡単に入力できるUIが作成されます。たとえば、Customerのカスタムフィールドのセットを制限し、DateOfBirthを日付に指定し、そのStoreIDが実際の店舗のID。

このメタデータの一部は、XMLスキーマとして管理できます。私はスキーマがデータベースに格納されていることを確認し、入力されているカスタムフィールドを検証するために使用しました。これらのスキーマを使用してXMLデータを強く入力できるかどうかはわかりません。