假设我有一个像这样的会话表:
[Session]
-------
Id: int
UserId: int
想象一下,这是在极高流量网站中使用的,并且经常添加和删除Sessions
非常。如果我要将每个表的Id
列设为Identity列,我怎样才能轻松维护Id的种子,以便它们不会达到int
数据类型的限制?有没有另一种方法来确保我没有想到的唯一身份证?提前谢谢。
答案 0 :(得分:3)
而不是int使它变大,这将达到9,223,372,036,854,775,807
你当然可以从-9,223,372,036,854,775,808开始
答案 1 :(得分:1)
将id设为guid而不是int。 您将获得使用Guid.NewGuid()无法猜测且易于实现的唯一会话ID。
答案 2 :(得分:1)
如果您有网站维护期,则可以重新设置标识列。 Naff但很简单。
答案 3 :(得分:0)
特定会话可以存在多长时间?如果没有会话将持续超过X段时间,并且您知道在任何给定时间表中将不会有超过N个会话,并且您知道将添加新会话的最大速率,那么您可以实现某种形式的循环队列系统,循环使用一组最大数字。
例如,如果在任何给定时间点表中的行数永远不超过1000行,则在任何给定的5分钟时间内不会添加超过1000行,并且任何行都不会持续超过2天(夜间清理程序?),那么你每两天会经历1000 * 2 * 24 * 12 = 576,000个ID ...每两天就会在系统中添加,使用和删除每个id。
,围绕这个数字的大安全系数(可能是5,000,000)构建循环队列逻辑。当然,困难的部分是生成Id。我以前用一行“NextId”表完成了这个,它被定义并调用如下:
-- Create table
CREATE TABLE NextId
(NextId int not null)
-- Add the one row to the table
INSERT Nextid (Nextid) values (1)
可选地,在此处放置INSERT / DELETE触发器以防止添加或删除行
此过程将用于使NextId使用。单个事务当然是原子事务,因此您不必担心锁定。我用10来测试。你最后会得到一个Id值为0,但它是一个代理键,所以使用的实际值无关紧要。
CREATE PROCEDURE GetNextId
@NextId int OUTPUT
AS
SET NOCOUNT on
UPDATE NextId
set
@NextId = NextId
,NextId = (NextId + 1) % 10 -- 5000000
RETURN
以下是调用程序的方法:
DECLARE @NextId int
EXECUTE GetNextId @NextId output
PRINT @NextId
我不知道这在大量过高的情况下会有多好用,但它在公平规模的工作负载下运行良好。