这是使用 PostgreSQL 处理会话存储的愚蠢方法吗?我应该使用生成值吗?

问题描述 投票:0回答:1

我正在为一个小型应用程序制作一个登录系统 - 也就是说,不会有很多用户。我想我应该将会话存储为 4 字节整数,因为这已经足够了。

我的基本想法是这样的:

session_id INTEGER NOT NULL DEFAULT (random() * 4294967295 - 2147483648)

即,数据库创建一个或多或少的随机数,用作主键和会话标识符。

这种方法有明显的陷阱吗?如果发生碰撞怎么办?我想它会再试一次,但是真的吗?并且应该不存在表格被填满的风险,但是如果唯一数字即将用完会发生什么?

我还查看了像

GENERATED ALWAYS AS IDENTITY
GENERATED ALWAYS AS(expression) STORED
这样的定义,但我并不真正想要一个序列,而这些似乎需要不可变的函数,而 random() 显然不是不可变的。有没有办法用这种方法来实现它们?

我做了一些初步测试,我的基本想法似乎可行。但我不确定从长远来看是否有好处。

postgresql session random generated-columns
1个回答
0
投票
  1. session_id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
    - 这严格保证并强制执行唯一性。如果有人尝试第二次
    insert
    相同的
    session_id
    或再次
    update...set
    引入重复项,则会被拒绝并出现错误。
  2. Random()
    具有两个常量只会使唯一性可能。如果有足够的时间/尝试,它肯定会破裂。
  3. 如果不添加
    unique
    primary key
    ,你根本就没有强制执行它 - 没有任何东西会注意碰撞,没有任何东西报告它们,它们可以自由发生。
  4. 您总是可能会用完数字,但有了
    bigint
    uuid
    ,就有很多数字可以用完。除非这是一个非常大的项目,否则其他事情通常会比你设法耗尽它们更快地崩溃。
  5. 如果您想要非顺序标识,请使用
    uuid
    session_id uuid default gen_random_uuid() PRIMARY KEY
    
  6. 如果您担心标识符是连续的,可能是因为您正在暴露它们,即使它们不是连续的,您也不应该这样做。
© www.soinside.com 2019 - 2024. All rights reserved.