2010-08-31 77 views
3

应用程序在更新时会出现错误或获取错误,某些隐藏的错误会在几个月或几年后检测到,生成孤立的记录,甚至在使用正确的测试套件时都无处指向等等。 Alluring Rails不会在数据库级别实施参照完整性 - 由于其他地方讨论的一些很好的理由,它将保持这种状态 - 拥有可以检查数据库是否处于一致状态的工具仍然很不错。有没有Rails验证数据库参照完整性的工具?

由于模型描述了“应该是什么”,离线工具不可能验证所有数据的完整性。它可以在备份数据之前定期运行,或者为了开发人员的良好睡眠。

有没有这样的事情?

回答

0

如何使用DBMS来强制RI?你不需要Rails来为你做。

+0

ActiveRecord(在rails中使用的ORM)默认不支持这项功能 – f0ster 2013-05-07 21:47:17

+0

当然,但为什么要让一个软件工具的限制阻碍您的数据完整性需求呢?使用一些更好的工具。 – sqlvogel 2013-05-08 05:41:31

2

我不知道这样的工具。至少你已经意识到参照完整性危害的危险。那么为什么让自己受苦?正如dportas所建议的,首先使用外键引用。

要迁移使用它,添加如下内容:

execute('ALTER TABLE users ADD FOREIGN KEY (language_id) REFERENCES languages(id)') 

,使用户的LANGUAGE_ID列中的语言引用表中的有效行。

根据您的DBMS,这甚至会自动为您创建索引。还有一些rails的插件(检出pg_on_rails),它们为这些任务定义了易于使用的别名函数。

仅在备份文件上检查完整性是没有意义的,因为错误已经发生,那么您的数据可能已经混乱了。 (我去过那里) 另一方面,如上所述,当使用外键约束时,每一个操作都会破坏整体性。

想象一下,当你感到疼痛(=正在进行手术)时,要去看牙医,并用一种​​神奇的牙膏一次性刷牙,以保证你的牙齿在你的余生中都会很好。

要考虑的另一件事:应用程序中的错误将更容易找到,因为在尝试插入损坏的数据的代码中会引发异常。

所以请使用外键约束。您可以轻松地将这些语句添加到您现有的数据库。