【问题标题】:Why is it necessary to explicitly specify foreign keys and references in databases?为什么需要在数据库中显式指定外键和引用?
【发布时间】:2015-05-17 13:40:17
【问题描述】:
您能否解释一下为什么在创建表时需要指定这些外键?
我的意思是,我创建了两个具有一对多关系的表(在 ER 图中),但我没有指定外键和引用。我可以使用 where 子句连接表,甚至可以执行连接等。
可能,我没有得到一些基本概念,虽然我读过一些关于它的东西。我想这与数据一致性或引用完整性或其他东西有关。
那么,你能解释一下这些概念吗?
如果我有 8 到 10 个具有一对多关系的表并且我可以确保数据正确插入到数据库中,那么这些引用和外键是绝对需要的吗?
【问题讨论】:
标签:
mysql
sql
foreign-keys
foreign-key-relationship
【解决方案1】:
指定外键关系不是必要的。这只是一个好主意。
当您指定关系时,数据库会确保关系完整性。也就是说,它确保外键列中的值是合法值。
此外,外键上的cascade 选项在更新或删除值时有很大帮助。
【解决方案2】:
之所以需要,是为了确保data integrity。
假设您有一个名为orders 的表和一个名为order details 的表,它们都有一个名为order id 的列。
如果您不使用外键,您可能会为订单表中不存在的订单插入订单详细信息。
如果您尝试将订单详细信息添加到不存在的订单,拥有外键将使数据库引发错误。
如果您删除已经有详细信息的订单,也会引发错误,除非您先删除订单详细信息或在外键上指定cascade delete。
【解决方案3】:
外键约束的驱动力是对“数据完整性”的需求。当您指定外键约束时,DBMS(数据库服务器软件)可帮助您防止对数据的任何意外(无意)修改。就像您在帮助 DBMS 帮助您一样。因此,如果您指定约束条件,例如,当该产品存在未完成的 orders 时,可能会防止意外删除 product。
您会同意,在创建数据库(表)时仔细分析约束并在 SQL 中指定它们有助于确保完整性。
当您选择将“实体知识”保留在数据库级别时,这很有用。这是一个很好的开始方法,因为您的表(关系)或多或少是独立的。在比数据库更高的级别上进行所有这些一致性检查的另一种方法。例如,这就是像 Rails 这样的 MVC 框架采用的方法,其中模型是应用约束的层,而表本身不需要指定外键和其他约束。
通常哪种方法更好取决于您的口味,但您应该本着他们的精神使用构建块。