【问题标题】:SQL Server big tables or store data in a xml fieldSQL Server 大表或将数据存储在 xml 字段中
【发布时间】:2021-06-28 19:13:41
【问题描述】:

我有一个 .net 解决方案,其中包含客户需要填写的许多数据的大表单,例如一个包含许多步骤来填写我们需要获取的所有数据的表单。

所以我想知道它是否更好(从性能和设计方法)具有许多字段的传统大表,o 仅将数据存储在 XML 类型的一个字段中。

一个“TraditionalTable”的示例:

RecordId CustomerId Data 1 Data 2.... to Data N
1 120 01/01/1980 abcd .... 123
2 20 04/02/2004 fgh .... 230
3 10 05/01/1995 xyz .... 135

“DataWithXMLField”示例:

RecordId CustomerId FormData
1 120 < data>< customerdetails>< borndate>01/01/1980< /borndate>< /customerdetails >< financialinfo >...."

【问题讨论】:

    标签: sql sql-server database-design


    【解决方案1】:

    我已经完成了许多这样的系统,并且更喜欢将数据保存为 XML(通常它是一个序列化对象)。我发现这在运行时和设计时都很有效。 (请参阅下面有关二进制附件的项目)。

    以下是根据我过去所做的一些建议。显然它不是一个大小的锤子......

    数据通常由用户“收集”并由管理员“批准”。在收集数据时,将其存储为 XML。获得批准后,XML 将被分解并放入“普通”关系表/字段中。

    这些数据通常是通过多个页面收集的。以 XML 格式存储允许以对用户来说合乎逻辑但不太适合最终数据结构的方式收集数据。

    如果表单被放弃(未完成或取消),很容易删除一行。

    注意事项:

    • 一些数据与工作流相关,与正在收集的数据分开。例如,“表单状态”字段可能从“进行中”变为“已提交”到“已批准”。此类数据应保存为常规列。

    • 单独存储二进制数据。如果您的表单包含提交二进制数据(例如上传 PDF),我喜欢在前端生成一个 GUID。将该 GUID 存储在 XML 中,然后使用 GUID 单独保存二进制数据。可能在磁盘上或单独的“附件”表中。

    • 为 XML 的“版本号”定义一列。通过这种方式,您可以以编程方式识别 XML 中的内容。这将在您将来需要更改 XML 时有所帮助。

    • 为“摘要”定义一个列,该列是 XML 的简短人性化版本。例如,如果您的 XML 包含注册夏令营的信息,那么您的“XML 摘要”可能包含以下文本:“SMITH,JOHN,Camp White Pine 2021”。这个文本我们在前端计算。然后它可以用于显示数据行,而无需插入 XML。例如,可能存在列出需要批准的应用程序的管理页面。

    • 定义一列以指示 XML 是否满足您的所有要求。您不想在数据库中验证 XML(这通常很困难,并且可能与 UI 重复)。您的业​​务层可以将业务规则(验证)应用于 XML(或类),并在数据库中存储满足所有业务规则的指示符。

    【讨论】:

    • 谢谢罗伯特,你的回答很完整,给了我很多信息。关于保存一些归档值(例如单独的列)是一个很好的提示,亲切的问候。
    猜你喜欢
    • 2020-11-18
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    相关资源
    最近更新 更多