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

我正在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告诉您,具有某些限制).它告诉你的是如何找到行.

看到:

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...