Rails是否需要数据库级别的约束?

24

我和这篇文章中的人一样遇到了同样的问题。

我在想,为什么Rails不支持默认生成外键呢? 这不是必要的吗? 还是我们需要手动实现它?

2个回答

59

数据库约束不像在汽车中佩戴安全带一样必须。你可以随意驾驶,一切都很好,直到出现问题。安全带(约束)保护您(数据)的安全。

因此,强烈建议您创建约束以在数据库级别强制执行数据完整性,因为高度可能发生以下情况:1)您会在Rails之外的某个时候与数据库交互;2)您会在代码中犯错导致数据无效。

数据库约束可能需要更多工作,但它节省了大量的工作,尤其是当您的代码可以对数据进行假设并且不必进行大量的有效性检查时。

ActiveRecord不支持外键的原因是因为它旨在具有数据库通用性,并且不是所有数据库系统都支持外键。


15
我喜欢安全带的比喻! - Zabba
1
另一个原因是,除非你的Rails应用程序是在单个服务器上运行的一个进程、一个线程,否则它可能会同时处理多个请求。例如validates :username, uniqueness: true这样的东西在这种情况下可能会失败,因为每个应用程序实例都会检查所请求的用户名,如果找不到它就插入它。只有唯一索引可以防止这种情况的发生。总的来说,任何类似于“在数据库中当前的数据是否有效?”的检查只能由数据库本身可靠地完成。 - Nathan Long

9
您可以使用Foreigner插件来添加外键支持。
并非所有支持ActiveRecord的数据库都支持外键,因此Rails框架不将其作为核心功能包含在内。
注意:由于Rails在4.2中添加了FK支持,上述内容已不再准确。

2
简短回答是,是的它很重要,但默认情况下您必须使用:options哈希。ActiveRecord处于无法假设支持外键约束的抽象级别上。 - Adam Lassek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接