【问题标题】: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 框架采用的方法,其中模型是应用约束的层,而表本身不需要指定外键和其他约束。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-13
          • 2012-08-26
          • 2021-01-21
          • 1970-01-01
          • 2020-02-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多