应用程序在更新时有错误或得到错误,有些隐藏在几个月或几年后被检测到,产生孤立的记录,无处指向的键等,即使使用适当的测试套件也是如此。
尽管 Rails 没有在数据库级别强制引用完整性——出于其他地方讨论的一些很好的原因,它将保持这种状态——拥有可以检查数据库是否处于一致状态的工具仍然很好。
由于模型描述了“应该”,离线工具不可能验证所有数据的完整性。它可以在备份数据之前定期运行,或者只是为了开发人员良好的睡眠。
有这样的吗?
应用程序在更新时有错误或得到错误,有些隐藏在几个月或几年后被检测到,产生孤立的记录,无处指向的键等,即使使用适当的测试套件也是如此。
尽管 Rails 没有在数据库级别强制引用完整性——出于其他地方讨论的一些很好的原因,它将保持这种状态——拥有可以检查数据库是否处于一致状态的工具仍然很好。
由于模型描述了“应该”,离线工具不可能验证所有数据的完整性。它可以在备份数据之前定期运行,或者只是为了开发人员良好的睡眠。
有这样的吗?
我不知道有这样的工具。至少您知道参照完整性危害的危险。那为什么要让自己受苦呢?正如 dportas 建议的那样,首先使用外键引用。
要在迁移中使用它,请添加如下内容:
execute('ALTER TABLE users ADD FOREIGN KEY (language_id) REFERENCES languages(id)')
使用户的 language_id 列引用语言表中的有效行。
根据您的 DBMS,这甚至会自动为您创建索引。还有用于 Rails 的插件(查看 pg_on_rails),它们为这些任务定义了易于使用的别名函数。
只检查备份文件的完整性是没有意义的,因为错误已经发生了,你的数据可能已经被弄乱了。(我去过那里)另一方面,当使用如上所述的外键约束时,每一个会破坏完整性的操作都会失败。
可以把它想象成当您感到疼痛(=进行手术)时去看牙医与使用神奇的牙膏刷牙一次,以保证您的牙齿在您的余生中都会很好。
要考虑的另一件事:应用程序中的错误将更容易定位,因为尝试插入损坏数据的代码会引发异常。
所以请使用外键约束。您可以轻松地将这些语句添加到现有数据库中。
How about using the DBMS to enforce RI? You don't need Rails to do that for you.