加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 我的用户表中是否正常/建议使用“id hole”(ra

发布时间:2020-12-17 02:38:41 所属栏目:百科 来源:网络整理
导读:我正在Heroku上构建一个基本的Rails应用程序(使用 postgresql和db客户端PGAdmin) 我有一个基本的用户表,名称,电子邮件,密码…… 我注意到当我删除一个用户(例如id = 6的用户)然后我添加新用户时,新用户没有插入id = 6(我说的是左边的第一列调用pgadmin“id P
我正在Heroku上构建一个基本的Rails应用程序(使用 postgresql和db客户端PGAdmin)

我有一个基本的用户表,名称,电子邮件,密码……

我注意到当我删除一个用户(例如id = 6的用户)然后我添加新用户时,新用户没有插入id = 6(我说的是左边的第一列调用pgadmin“id PK Serial”)所以基本上我有很多漏洞,因为在我的训练中我经常删除并添加用户.

所以我最终得到了id列:id = 1,id = 5,id = 9 id = 10 ……很多洞.

有关系吗?它可能会影响我以后需要做的db请求吗?

如果我需要更正并强制db“填充”所有id插槽,我应该怎么做?

解决方法

在表标识序列中有“漏洞”是绝对正常的 – 即使您从未删除过一行.我写了更多关于这个 in this earlier answer的内容.

根据设计,PostgreSQL序列不受正常事务规则的约束.如果它们不是那么一次只有一个事务可以获取一个ID,那么你一次就不能有多个会话插入一个表.这将导致悲惨的表现.

这在the PostgreSQL manual on the nextval call中解释 – 从序列中获取值的调用:

Important: To avoid blocking concurrent transactions that obtain
numbers from the same sequence,a nextval operation is never rolled
back; that is,once a value has been fetched it is considered used,
even if the transaction that did the nextval later aborts. This means
that aborted transactions might leave unused “holes” in the sequence
of assigned values.

从理论上讲,PostgreSQL可以维护已删除,已弃用和未使用的ID列表,但实际上,这在性能方面非常昂贵 – 并且极难实现.一旦应用程序获得了nextval的id,它就可以在将来的任何时候使用它,并且一些应用程序使用这种方法,缓存ID块以获得更好的内部并发性.

将生成的ID视为唯一的行号 – 这就是全部.它没有告诉你有多少行.它不会告诉您是否在另一行之后插入了一行(您可以使用created_time时间戳,可能由触发器维护).它不会告诉您是否在另一行之后提交了一行(系统xmin columm告诉您,具有某些限制).它告诉你的是如何找到行.

看到:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读