我一直在使用与SQL(MySQL)和Rails的表关联而没有问题,我从来不需要指定外键约束。
我只需在belongs_to表中添加一个table_id列,一切正常。
那我错过了什么?在MySQL或其他RDBMS中使用外键子句有什么意义?
感谢。
答案 0 :(得分:2)
外键是两个表之间的引用约束
存在外键约束的原因是为了保证引用的行存在。
外键标识一个(引用或子)表中的一列或一组列,这些列引用另一个(引用或父)表中的一列或一组列。
使用此处列出的外键有很多原因:Why Should one use foreign keys
答案 1 :(得分:1)
Rails(更具体地说ActiveRecord)为您自动猜测外键。
...默认情况下,这被认为是带有“_id”后缀的关联的名称。
外键强制执行参照完整性。
外键:表中的一列或一组列,其值必须与另一个表的行的至少一个PrimaryKey值匹配。
另见:
答案 2 :(得分:1)
外键或任何引用约束的基本思想是数据库不应该允许您存储明显无效的数据。它是数据一致性的核心组成部分,是ACID rules之一。
如果您的数据模型显示您可以将多个电话号码与帐户相关联,则可以将电话号码定义为需要有效的帐号。因此,无法存储孤立的电话记录,因为如果没有有效的帐号,您无法在电话表中插入一行,并且如果没有先删除电话号码,则无法删除帐户。如果该字段是生日,您可以强制执行日期在明天日期之前的约束。如果该字段为高度,则可以强制该距离在30到4000厘米之间。这意味着任何应用程序都无法在数据库中存储无效数据。
“好吧,为什么我只能将所有这些写入我的应用程序?”你问。对于单应用程序数据库,您可以。但是,任何具有存储用于业务操作的数据的非平凡数据库的企业都希望直接访问数据 。他们希望能够从财务或人力资源部门导入数据,或者将地址导出到销售部门,或者通过从Active Directory等导入应用程序用户帐户来创建应用程序用户帐户。对于非平凡的应用程序,用户的数据是重要的,是他们想要访问的内容。在某些时候,他们会希望在没有应用程序代码阻碍的情况下访问他们的数据。这是RDMBS的真正功能和优势,也是使系统集成成为可能的原因。
但是,如果您的所有规则都存储在应用程序中,那么您的用户将需要非常小心他们如何操纵数据库,以免导致应用程序崩溃。如果指定关系约束和参照完整性,则需要其他应用程序以对将要使用它的任何应用程序有意义的方式修改数据。逻辑与数据(它所属的数据)而不是应用程序相关联。
请注意关于参照完整性的MySQL is absolute balls。通常通过插入明显无效的值(例如今天的日期时间,当您尝试将空日期插入约束not null default null
的日期时间字段时,它将倾向于成功而不是抛出错误。有一个很好的理由让DBA说MySQL是个笑话。
答案 3 :(得分:0)
外键强制执行referential integrity。外键约束将阻止您或任何其他用户在表中错误地添加不正确的记录。它确保在外键中输入的数据(ID)确实存在于引用表中。如果某些错误的客户端代码尝试插入不正确的数据,那么在外键约束的情况下会引发异常,否则如果不存在约束,则数据库将以不一致的数据结束。
答案 4 :(得分:0)
使用外键的一些优点我可以想到:
使表间的数据保持一致,防止出现不良数据(例如表A有一些记录引用表B中不存在的内容)
帮助记录我们的数据库
某些框架基于外键生成域模型