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

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

概述我正在Heroku上构建一个基本的Rails应用程序(使用 postgresql和db客户端PGAdmin) 我有一个基本的用户表,名称,电子邮件,密码…… 我注意到当我删除一个用户(例如id = 6的用户)然后我添加新用户时,新用户没有插入id = 6(我说的是左边的第一列调用pgadmin“id PK Serial”)所以基本上我有很多漏洞,因为在我的训练中我经常删除并添加用户. 所以我最终得 我正在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告诉您,具有某些限制).它告诉你的是如何找到行.

看到:

总结

以上是内存溢出为你收集整理的ruby-on-rails – 我的用户表中是否正常/建议使用“id hole”(rails 3.2 / postgresql)全部内容,希望文章能够帮你解决ruby-on-rails – 我的用户表中是否正常/建议使用“id hole”(rails 3.2 / postgresql)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1281450.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存