我在做什么
我正在创建一个 SQL 表,它将为复杂类型的对象提供后端存储机制。我正在尝试确定如何以最佳性能实现这一目标。我需要能够查询复杂类型的每个单独的简单类型值(例如,地址复杂类型中城市的字符串值)。
我原本以为我可以将复杂类型值作为 XML 存储在一条记录中,但现在我担心这种设计的搜索性能。 我需要能够在不改变数据库访问层的任何内容的情况下即时创建变量模式。
我现在在哪里
现在我正在考虑创建以下表格。
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,我将在 Schemas 表中有一条记录,其中包含地址 xml 模式的 XSD 定义。该实例将具有一个唯一标识符(Documents 表的 PK),该标识符分配给 Schemas 表中 Address 记录的 SchemaId。然后在 Values 表中将有五个记录来表示此地址。
它们看起来像:
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 表)为了向域模型添加一个新的聚合根。
我对使用除 SQL 之外的 .NET 兼容技术的可能性持开放态度,但我要求任何此类建议都得到充分证实才能考虑。