gpt4 book ai didi

sql - 在 SQL 中使用可变模式持久化复杂类型的最有效方法

转载 作者:行者123 更新时间:2023-12-05 00:38:54 24 4
gpt4 key购买 nike

我在做什么

我正在创建一个 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 获取整个对象时,我会有一个通用脚本来创建一个模拟复杂类型的非规范化数据表的 View 。

我想知道的

我相信有更好的方法来完成我想要做的事情,但我对不同 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 定义。此实例将具有分配给架构表中地址记录的架构 ID 的唯一标识符(文档表的 PK)。值表中将有五个记录来表示此地址。

它们看起来像:
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 兼容技术,但我将要求任何此类建议都得到充分证实才能得到考虑。

最佳答案

如何在架构层面寻找解决方案?在我发现 之前,我也对复杂的图形和性能感到困惑。 CQRS .

【开启布道者模式】

  • 您可以使用基于文档或关系的存储方式。甚至两者! (事件采购)
  • 很好的关注点分离:读取模型与写入模型
  • 有你的蛋糕,也吃它!

  • 好的,有一个初步的学习/技术曲线需要克服;)

    【结束布道者模式】

    正如您所说:“ 我需要能够在不更改数据库访问层的任何内容的情况下动态创建变量模式。 ”主要好处是您的读取模型可以非常快,因为它是为读取而设计的.如果您添加 事件采购为了混合,您可以将读取模型删除并重建为您想要的任何模式......甚至“在线”。

    有一些不错的开源框架,比如 nServiceBus,可以节省大量时间和技术挑战。一切都取决于您想要将这些概念带到多远,您愿意/可以花时间。如果您遵循 Greg Young 的方法,您甚至可以从基础开始。请参阅以下链接中的信息。


  • CQRS Examples and Screencasts
  • CQRS Questions
  • Intro (另见视频)
  • 关于sql - 在 SQL 中使用可变模式持久化复杂类型的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5092030/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com