我们将记录请求和响应数据并存储到SQL Serve 2008r2。该数据将定期清除:例如每天30天的所有内容都将被删除。
当我们知道数据会定期清除时,我们应该为此模式中的密钥使用什么数据类型?如果我们在清除后没有重新种植,顺序身份将超过2 ^ 31。
我们将根据RequestLog表中的LogActivity Id查询请求/响应数据。
答案 0 :(得分:1)
只需使用BIGINT
即可。你不会用完的。像许多人一样,你大大低估了63位数字的规模。
如果你每秒创造30亿条记录,那么用完大约需要100年才能完成:
100 years * 365.25 days/yr * 24 hrs/day * 60 min/hr * 60 sec/min = 3,155,760,000 seconds.
最大BIGINT
是2 ^ 63-1 = 9,223,372,036,854,775,807。
9,223,372,036,854,775,807 / 3,155,760,000 ~= 2,924,712,087 records per second
以该速率生成30天的8字节整数:
8 bytes * 2924712087 per second * 60 seconds/min * 60 min/hour * 24 hours/day * 30 days/month = 60,646,829,836,032,000
或60.6 PB。只是为了那么多8字节键。如果您使用int
,它仍然是30 PB。只是为了存储密钥。你是否真的会产生那么多数据?
答案 1 :(得分:0)
我建议使用UNIQUEIDENTIFIER
(即GUID)。它们基本上是丢弃值,并且使用NEWID()
函数很容易生成:
INSERT INTO [Requests]
([Id], [Request], [Response], [CreateDateTime])
VALUES
(NEWID(), @RequestValue, @ResponseValue, GETDATE())
您还可以提前在代码中生成GUID。这样做的好处是,您可以在将记录插入数据库之前使用ID值(例如,将对象添加到身份映射等)。然后,您可以执行以下插入:
INSERT INTO [Requests]
([Id], [Request], [Response], [CreateDateTime])
VALUES
(@ID, @RequestValue, @ResponseValue, GETDATE())
答案 2 :(得分:-1)
使用CreateDateTime作为PK - 它将永远持续。