【发布时间】:2023-03-20 02:31:02
【问题描述】:
我正在构建一个表来跟踪我的数据库中特定对象的历史记录。 目前我有以下列:
HistoryId int IDENTITY(1,1) NOT NULL
HistoryDate datetimeoffset(7) NOT NULL
HistoryTypeId int NOT NULL
HistoryDetails nvarchar(max) NULL
在大多数情况下,每个历史记录项都可以通过 HistoryTypeId 进行自我解释,因此 HistoryDetails 要么为 Null,要么非常小。但是对于几个历史类型,细节数据会很大。是否可以使用 nvarchar(max) 处理所有记录,或者我应该将它分开并为需要超过 64 个字符的历史类型添加一个额外的列(见下文)?粗略估计,80%-90% 的记录不需要超过 64 个字符的详细信息,表中将有数百万条记录。
HistoryId int IDENTITY(1,1) NOT NULL
HistoryDate datetimeoffset(7) NOT NULL
HistoryTypeId int NOT NULL
HistoryDetails nvarchar(64) NULL
HistoryDetailsMore nvarchar(max) NULL
【问题讨论】:
-
能否请您针对您的表发布一个典型的查询?
-
Quassnoi:您的计算列解决方案正是我想要的。我的典型查询是这样的: SELECT UserId, HistoryDate, HistoryTypeId, HistoryDetails FROM History WHERE UserId=XXX 所以我想要所有 HistoryTypeIds 的 HistoryDetails 但大多数情况下只有前 64 个字符(否则它将通过辅助查询处理)。
标签: sql sql-server tsql database-design data-modeling