ruby-on-rails - 可以依赖数据库中的自动递增主键吗?

标签 ruby-on-rails database database-design primary-key auto-increment

在我目前的 Rails 应用程序中,我通过按“created_at”字段对模型进行排序来解决调度冲突。但是,我意识到当从允许这样做的表单中插入多个模型时,所有 created_at 时间都完全相同!

这更像是一个关于最佳编程实践的问题:您的应用程序能否依靠数据库中的 ID 列随着每个 INSERT 递增越来越大以获得它们的创建顺序?换句话说,我能否按 ID 列对从数据库中提取的一组行进行排序,并确保这是基于创建顺序的准确排序?这在我的应用程序中是一个好的做法吗?

最佳答案

生成的标识号将是唯一的。 无论您是否使用序列,例如在 PostgreSQL 和 Oracle 中,或者您是否使用其他机制,例如 MySQL 的自动增量。

但是,序列通常是批量获取的,例如 20 个数字。 所以使用 PostgreSQL 你不能确定哪个字段先被插入。插入记录的 ID 甚至可能存在间隙。

因此,您不应该为这样的任务使用生成的 id 字段,以免依赖数据库实现细节。

在命令执行期间生成一个createdupdated 字段对于以后按创建时间或更新时间排序要好得多。 例如:

INSERT INTO A (data, created) VALUES (smething, DATE())
UPDATE A SET data=something, updated=DATE()

关于ruby-on-rails - 可以依赖数据库中的自动递增主键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/845402/

相关文章:

ruby-on-rails - 如何在 rspec 测试中输出变量?

ruby-on-rails - Rails 3.0/3.2 : Called id for nil, 错误地是 4 - 如果你真的想要 nil 的 id,请使用 object_id

ruby-on-rails - Bundler 在创建新的 Rails 应用程序时崩溃

sqlite 触发器检查新元组值与子查询的相等性

sql - 在 MySQL 中,如何将一张表的内容复制到同一个数据库中的另一张表中?

成员(member)订阅付款的 SQL 表设计帮助

ruby-on-rails - 在 OSX Yosemite 上安装 EventMachine gem 时出错

mysql - 记录 mysql 中一列或多列的更改

数据库设计 : Categories in their own table?

database-design - 什么是规范的覆盖,关闭和无关属性?