为什么需要在数据库中显式指定外键和引用?

Why is it necessary to explicitly specify foreign keys and references in databases?

能否请您解释一下为什么在创建表时必须指定那些外键? 我的意思是,我创建了两个具有一对多关系的表(在 ER 图中),但我没有指定外键和引用。我可以使用 where 子句连接表,甚至执行连接等。

可能我不了解一些基本概念,尽管我已经阅读了一些相关内容。我猜它与数据一致性或参照完整性或其他东西有关。

那么,你能给我解释一下这些概念吗? 如果我有 8-10 个具有一对多关系的表并且我可以确保将数据正确插入数据库,那么这些引用和外键是否是绝对必需的?

之所以有必要,是为了确保data integrity
假设您有一个名为 orders 的 table 和一个名为 order details 的 table,它们都有一个名为 order id.
的列 如果您不使用外键,您可能会为订单 table.
中不存在的订单插入订单详细信息 如果您尝试向不存在的订单添加订单详细信息,则拥有外键会使数据库引发错误。
如果您删除已经有详细信息的订单,它也会引发错误,除非您先删除订单详细信息或在外键上指定 cascade delete

不需要指定外键关系。这真是个好主意。

当您指定关系时,数据库会确保关系完整性。也就是说,它确保外键列中的值是合法值。

此外,外键的 cascade 选项在更新或删除值时有很大帮助。

外键约束的驱动是'data integrity'的需要。当您指定外键约束时,DBMS(数据库服务器软件)可以帮助您防止对数据进行任何意外(无意)修改。就像您在帮助 DBMS 帮助您一样。因此,如果您指定约束,例如,当该产品有未完成的 orders 时,可以防止意外删除 product

您会同意,当您在创建数据库(表)时仔细分析约束并在 SQL 中指定它们时,它有助于确保完整性。

当您选择将 'knowledge of your entities' 保留在数据库级别本身时,这很有用。这是一个很好的开始方法,因为您的表(关系)或多或少是独立的。在高于数据库的级别进行所有这些一致性检查的替代方法。这是一种方法,例如,像 Rails 这样的 MVC 框架采用的方法,其中模型是应用约束的层,表本身不需要指定外部键和其他约束。

通常哪种方法更好取决于您的口味,但您应该本着他们的精神使用积木。