我正在为一个小型应用程序制作一个登录系统 - 也就是说,不会有很多用户。我想我应该将会话存储为 4 字节整数,因为这已经足够了。
我的基本想法是这样的:
session_id INTEGER NOT NULL DEFAULT (random() * 4294967295 - 2147483648)
即,数据库创建一个或多或少的随机数,用作主键和会话标识符。
这种方法有明显的陷阱吗?如果发生碰撞怎么办?我想它会再试一次,但是真的吗?并且应该不存在表格被填满的风险,但是如果唯一数字即将用完会发生什么?
我还查看了像
GENERATED ALWAYS AS IDENTITY
或 GENERATED ALWAYS AS(expression) STORED
这样的定义,但我并不真正想要一个序列,而这些似乎需要不可变的函数,而 random() 显然不是不可变的。有没有办法用这种方法来实现它们?
我做了一些初步测试,我的基本想法似乎可行。但我不确定从长远来看是否有好处。
session_id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
- 这严格保证并强制执行唯一性。如果有人尝试第二次 insert
相同的 session_id
或再次 update...set
引入重复项,则会被拒绝并出现错误。Random()
具有两个常量只会使唯一性可能。如果有足够的时间/尝试,它肯定会破裂。unique
或 primary key
,你根本就没有强制执行它 - 没有任何东西会注意碰撞,没有任何东西报告它们,它们可以自由发生。bigint
和 uuid
,就有很多数字可以用完。除非这是一个非常大的项目,否则其他事情通常会比你设法耗尽它们更快地崩溃。uuid
:
session_id uuid default gen_random_uuid() PRIMARY KEY