在 SQL 中使用变量模式持久保存复杂类型的最有效方法

2023-12-13

我在做什么

我正在创建一个 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 定义。该实例将有一个唯一标识符(文档表的 PK),该标识符被分配给架构表中地址记录的 SchemaId。然后,值表中将有五个记录来表示该地址。

它们看起来像:

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 的方法,您甚至可以从基础知识开始。请参阅下面链接中的信息。

See

  • CQRS 示例和截屏视频
  • CQRS 问题
  • Intro(另请参阅视频)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SQL 中使用变量模式持久保存复杂类型的最有效方法 的相关文章

随机推荐

  • Android 示例评论BEGIN_INCLUDE END_INCLUDE

    在阅读一些 Android 示例时 我通常会看到类似的评论 BEGIN INCLUDE something END INCLUDE something 但是 我当前的 IDE Android Studio 1 1 无法识别它们 或者可能是我
  • Python a、b = b、a +b

    这是我的第一个问题 我开始学习Python 之间有区别吗 a b b a b and a b b a b 当您在下面的示例中编写它时 它会显示不同的结果 def fib n a b 0 1 while a lt n print a end
  • 二元运算符 + 不能应用于 CGfloat int 类型的操作数

    我遇到了与之前相同的问题 但使用了不同的代码行 但这一次 我无法使用与上次相同的方法修复它 var Y Int 0 var X Int 0 IBOutlet var ball UIImageView ball center CGPointM
  • 使用 BufferedImage 和 ImageIO 将图像转换为 byte[] 后图像大小减小

    我正在使用以下代码将图像转换为 byte public static byte extractBytes String ImageName throws IOException ByteArrayOutputStream baos new
  • Chrome 扩展 API:后台页面上的 chrome.tabs.captureVisibleTab 到内容脚本

    我的总体目标是使用以下方法通过后台页面截取屏幕截图 http developer chrome com extensions tabs html method captureVisibleTab 并将其传递给内容脚本 以便我可以使用页面的
  • 如何以编程方式读取 C# 中的本机 DLL 导入?

    如何以编程方式分析本机 DLL 以读取其导入 编辑 我原来的问题如下所示 以及大量有缺陷的代码 请参阅下面的答案以获得更正确的代码 C 代码位于这个链接旨在打印本机 DLL 的导入 我发现当我使用原始示例的目标 MSCOREE DLL 运行
  • 使用两种不同的混淆器处理相同的.NET程序集[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 使用两种不同的混淆器处理相同的 NET 程序集 将一个程序集的输出作为输入提供给另一个程序集 会增加使反编译变得不可能的机会吗 Thanks 反编译从来都不是不可能的 不过 当前的工具可能
  • Windows 10 中 Python 3.7 中的 pip install 索引器错误

    我正在尝试在 Python 3 7 中使用 Jupyter 笔记本安装索引器 pip install indexer 我收到以下错误 Collecting indexer Using cached https files pythonhos
  • 第一个最后一个元素

    XSLT XML 问题 研究一个简单的转换 我有简单的索引 xml 输入 我必须为每章输出第一个和最后一个元素 如下所示 任何帮助都感激不尽 问候 JJ Input
  • SHGetPropertyStoreForWindow - 如何设置现有 System.AppUserModel.ID 的属性

    所以我通过以下方式将窗口从主选项卡组中分离出来IPropertyStore via SHGetPropertyStoreForWindow像这样 IPropertyStore SetValue pps PKEY AppUserModel I
  • Azure ML 和 Azure ML 实验之间的区别

    我是 Azure ML 的新手 我有一些疑问 有人可以澄清下面列出的我的疑问吗 Azure ML 服务和 Azure ML 实验服务之间有什么区别 Azure ML 工作台和 Azure ML Studio 之间有什么区别 我想使用 azu
  • 编辑控件不生成 WM_COMMAND 消息

    我有一个编辑控件 在父窗口中我正在听WM COMMAND信息 但我的控件不会在更改时发送它 此外 当我使用 Spy 观看消息时 我只能在编辑控件本身上看到不同的键盘消息 并且主父窗口中的唯一消息是WM CTLCOLOREDIT P S 我正
  • 如何在TabView的选项卡之间发送信号(Qt5)

    我有带有两个选项卡的 TabView 每个选项卡都有 Item 元素 其中包含其他内容 我需要从一个选项卡发送信号并在其他选项卡中捕获 处理 它 如果我尝试将信号从一个选项卡 项目 发送到另一个选项卡 它不起作用 并且不会显示任何错误 我找
  • React Noob - onChange 元素失去焦点

    我正在尝试创建一个基本的登录页面 该页面接受用户凭据并将其提交到登录 api 问题是当onChange事件触发 设置用户凭据 元素失去焦点 我不应该更新凭证吗onChange import React Component PropTypes
  • 显示来自 GridFS 的 HTML 图像

    我正在 GridFS 中上传图像 但不知道如何在 img tag 我尝试了以下代码 conn once open function var gfs Grid conn db mongoose mongo gfs files find fil
  • WiX v3 安装项目,无法通过应用程序和功能卸载

    我很难弄清楚是什么导致了这个奇怪的问题 因此 我按照 WiX v3 安装项目文档创建了一个非常基本的 msi 几乎只是提供的模板 但无论我尝试什么 每当我通过 Windows 10 卸载它时Apps Features界面 我不断收到这个 但
  • Typescript如何使用稍后指定的泛型类型?

    首先 这是我第一次用CodeSandbox来创建一个简化的例子 欢迎任何有关如何改进这一点的建议 问题 我想介绍动物的事实 有些事实是所有动物共有的 而另一些则是动物特有的 在我的主要组件中App 我还不知道类型 所以我想保留它的通用性An
  • 通过 AlarmManager 设置不精确的警报时会有多少延迟? [复制]

    这个问题在这里已经有答案了 使用时AlarmManager要设置闹钟 除非您设置了精确的闹钟 否则可能会出现延迟 在指定时间之后的某个时间触发闹钟 是否可以保证延迟的范围是多少 我想成为一名负责任的开发人员 如果延迟不超过 例如 一分钟 则
  • 在iphone中的uiwebview中显示文本

    我想在 uiwebview 中显示文本数据 有人可以指导如何做同样的事情 使用 UIWebViews loadHTMLString 方法 void loadHTMLString NSString string baseURL NSURL b
  • 在 SQL 中使用变量模式持久保存复杂类型的最有效方法

    我在做什么 我正在创建一个 SQL 表 它将为复杂类型的对象提供后端存储机制 我正在尝试确定如何以最佳性能实现这一目标 我需要能够查询复杂类型的每个单独的简单类型值 例如 地址复杂类型中城市的字符串值 我原本以为可以将复杂类型值作为 XML