私がしていること
複合型オブジェクトのバックエンド ストレージ メカニズムを提供する SQL テーブルを作成しています。最高のパフォーマンスでこれを達成する方法を決定しようとしています。複合型の個々の単純型値 (たとえば、Address 複合型の City の String 値) に対してクエリを実行できる必要があります。
複合型の値を XML として 1 つのレコードに格納できると当初は考えていましたが、この設計の検索パフォーマンスが気になります。 データベース アクセス層について何も変更せずに、その場で可変スキーマを作成できる必要があります。
今いる場所
現在、以下の表を作成しようと考えています。
TABLE: Schemas
COLUMN NAME DATA TYPE
SchemaId uniqueidentifier
Xsd xml //contains the schema for the document of the given complex type
DeserializeType varchar(200) //The Full Type name of the C# class to which the document deserializes.
TABLE: Documents
COLUMN NAME DATA TYPE
DocumentId uniqueidentifier
SchemaId uniqueidentifier
TABLE: Values //The DocumentId+ValueXPath function as a PK
COLUMN NAME DATA TYPE
DocumentId uniqueidentifier
ValueXPath varchar(250)
Value text
これらのテーブルから、クエリを実行するときに、値テーブルで一連の自己結合を行います。DocumentId でオブジェクト全体を取得したい場合は、複合型の非正規化されたデータ テーブルを模倣するビューを作成するための汎用スクリプトが必要です。
知りたいこと
私がしようとしていることを達成するためのより良い方法があると信じていますが、さまざまな SQL 手法の相対的なパフォーマンス上の利点については、私は少し無知です。具体的には、次のパフォーマンス コストがわかりません。
1 - comparing the value of a text field versus of a varchar field.
2 - different kind of joins versus nested queries
3 - getting a view versus an xml document from the sql db
4 - doing some other things that I don't even know I don't know would be affecting my query but, I am experienced enough to know exist
SQL のこれらのパフォーマンスの問題に関する情報やリソース、およびこの一般的な問題に効率的に取り組む方法についての推奨事項をいただければ幸いです。
例えば、
これは私が現在やろうとしていることの例です。
次のようなC#クラスのアドレスがあります
public class Address{
string Line1 {get;set;}
string Line2 {get;set;}
string City {get;set;}
string State {get;set;}
string Zip {get;set;
}
インスタンスはから構築されますnew Address{Line1="17 Mulberry Street", Line2="Apt C", City="New York", State="NY", Zip="10001"}
その XML 値は次のようになります。
<Address>
<Line1>17 Mulberry Street</Line1>
<Line2>Apt C</Line2>
<City>New York</City>
<State>NY</State>
<Zip>10001</Zip>
</Address>
上記の db-schema を使用すると、アドレス xml スキーマの XSD 定義を持つ Schemas テーブルに単一のレコードが作成されます。このインスタンスには、Schemas テーブルの Address レコードの SchemaId に割り当てられた uniqueidentifier (Documents テーブルの PK) があります。Values テーブルには、この Address を表す 5 つのレコードがあります。
それらは次のようになります。
DocumentId ValueXPath Value
82415E8A-8D95-4bb3-9E5C-AA4365850C70 /Address/Line1 17 Mulberry Street
82415E8A-8D95-4bb3-9E5C-AA4365850C70 /Address/Line2 Apt C
82415E8A-8D95-4bb3-9E5C-AA4365850C70 /Address/City New York
82415E8A-8D95-4bb3-9E5C-AA4365850C70 /Address/State NY
82415E8A-8D95-4bb3-9E5C-AA4365850C70 /Address/Zip 10001
バウンティが追加されました...
私の目的は、完全に検索可能で、アプリケーション層から生成されたデータ スキーマを持つデータ アクセス層をアプリケーションに与えるために必要なリソースを取得することです。新しい集約ルートをドメイン モデルに追加します。
私は、SQL 以外の .NET 互換テクノロジを使用する可能性を受け入れますが、そのような提案が検討されるためには、十分に実証されている必要があります。