SQL 服务器:设计问题 - 将记录存储为行与 BLOB - NVARCHAR(MAX)

SQL Server: Design question - stored records as rows vs as BLOB - NVARCHAR(MAX)

我正在创建一个时间表供我们的工程师分析。每天下载时间表,并在本地计算机上进行分析。

所以,现在,我陷入了将时间表存储为 table 行或 nvarchar(max) 的困境。

这是要求

  1. 每天都会生成时间表。每个时间表精确到 1 秒。因此,每个 计划 .
  2. 最多包含 86,400 条记录
  3. 一天内,根据设置,系统可以为每个工程师生成多达 100 个计划(我们有大约 10 个工程师)
  4. 时间表包含以下字段:INT | INT | INT | INT | NVARCHAR(1024) | NVARCHAR(64) | BIT | BIT | DATETIME | DATETIME(总结:4x INTs2x NVARCHARs2x BITs2x 日期时间)
  5. 时间表很少会更新,但可以更新。 updatable 字段是:2x BITs1x DATETIME .

现在看看常见的情况:

In a day, it will generates about 1,296,000 records per day.

This is the calculation of common case scenario:
- 10 seconds accuracy per schedule = 8,640 rows
- 5 engineers run the scheduler each day
- Each engineer generates about 30 schedules

So total is: 8,640 * 5 * 30 = 1,296,000 records

如果我将每个计划存储为 逗号分隔 的 NVARCHAR(MAX),那么记录数将减少到每天仅 150 条记录.

Here is the calculation:
- 10 seconds accuracy per schedule = 8,640 rows --> stored as NVARCHAR (becomes 1 record)
- 5 engineers run the scheduler each day
- Each engineer generates about 30 schedules

So total is: 5 * 30 = 150 records

现在,这是这些时间表的要求:

  1. 生成的日程表可以在网站上查看。
  2. 应用程序每天下载时间表进行分析。
  3. 分析完成后可以更新字段(2x BIT)。这些字段可以由应用程序更新(完成分析计划后),也可以由工程师在网站上更新(手动)。
  4. 所有生成的计划必须至少保存 3 个月以供审核。

你有什么建议?将计划存储为 table 行 NVARCHAR(MAX)

除了行计数之外,它们将数据存储在一列中有什么好处吗?如果没有,对我来说,你可以保存以规范化方式存储数据。


由于不同的需求,我使用了两种技术来存储数据。当然,将数据存储在 VARBINARY(MAX)NVARCHAR(MAX) 中会导致许多困难:

  • 无法按某些字段编制索引和搜索
  • 为了执行更新,必须对数据进行规范化、修改,然后再次构建为 string/binary
  • 为了执行报告,数据必须再次归一化

所以,鉴于以上原因,我会建议选择 table 格式。此外,如果您觉得以某种序列化方式导出数据更好,如果使用 SQL Server 2017 及更高版本,您始终可以实现这样的 SQL CLR string concatenation or use the built-in

此外,最好使用 separators,如 CHAR(31) 和 CHAR(30) 用于列和行。然后使用 tab/new lines/commas/semi-colons 更清楚,因为输入数据不太可能包含此类数据并破坏您的数据。