在MySQL中,您是否需要设置外键?

6
假设您在MySQL数据库中有两个表格,如下所示:
人员表(people):
  primary key: PERSON_ID,
  NAME,
  SURNAME, etc.

表格地址:

  primary key: ADDRESS_ID,
  foreign key: PERSON_ID,
  addressLine1, etc.

如果你通过PHP来管理表格中的行的创建和数据的检索,那么你是否仍然需要在数据库中创建物理关系呢?如果是,为什么?


是的,我们只是对数据库进行规范化处理,以便通过键更快地获取数据并减少所需空间。 - Bajrang
为什么我们需要使用外键? - Devart
4个回答

9

是的,一个明显的原因是如果你想要连接表格,那么可以更快地检索行。创建外键约束会在列上自动创建索引。

所以,地址表的模式应该像这样,(假设People表的主键是PERSON_ID

CREATE TABLE Address
(
    Address_ID INT,
    Person_ID INT,
    ......,
    CONSTRAINT tb_pk PRIMARY KEY (Address_ID),
    CONTRRAINT tb_fk FOREIGN KEY (Person_ID) 
        REFERENCES People(Person_ID)
)

5
严格来说:您不一定需要使用FK。仔细索引和编写良好的查询似乎就足够了。但是,在确保数据一致性方面,FK和特别是FK约束非常有用(例如避免孤儿数据)。
假设您编写了应用程序,一切都经过测试,而且运行得很好。很棒,但谁能保证每次更改时都会在场?您是否打算自己维护代码,或者可能会有其他人进行快速修复/调整或在未来实现另一个功能?实际上,你永远不会是唯一编写和维护代码的人,即使你是唯一一个维护代码的人,随着时间的推移,你几乎肯定会遇到错误... FK告诉你和你的同事,tbl1的数据依赖于tbl2的数据,反之亦然。就像注释一样,这使得应用程序更易于维护。
错误更容易检测:创建一个从tbl1中删除记录的方法,但忘记更新tbl2以反映对第一个tbl所做的更改。当发生这种情况时,数据被破坏,但导致此问题的查询不会产生错误:SQL在语法上是正确的,并且它执行的操作是所需的操作。这种类型的错误可能会隐藏相当长的时间,而在发现这一点时,上帝知道有多少数据已经被破坏了...
最后,这是一个经常使用的论点,如果在一系列更新/删除查询的中途丢失与DB的连接怎么办?FK约束使您能够级联某些操作。我实际上没有看到过这种情况发生,但我知道没有人编写代码来保护针对这种情况的场景。删除或更新多个关系记录,但在此期间,与DB的连接由于某种原因被切断。您可能已编辑了tbl2,但在发送到tbl1的查询之前,连接就已经断开了。同样,我们得到了损坏的数据。在这里,FK的CASCADE非常有用。从tbl1中删除,并设置一个ON DELETE CASCADE规则,以便您可以放心地删除tbl2中的相关记录。在同样的情况下,ON DELETE RESTRICT也可以是一个相当有用的规则。
请注意,FK不是生命,宇宙和万物的终极答案(那是42-正如我们所知道的),但它们是真正关系数据库设计的重要组成部分。

2

1

有两种方法

-第一种是在编码端处理所有内容,管理删除或更新记录的事项,但当使用外键时,您正在强制执行关系,数据库不允许您删除具有外键约束的记录,特别是当您不想删除与之相关的记录时,会出现一些情况需要执行此类任务。

-第二种方法是在数据库端管理事物。如果数据库中存在1对多或多对多的关系,则外键将非常有用。此外,它们还具有一些好的操作-RESTRICT,CASCADE,SET NULL,NO ACTION,这些操作可以为您完成一些工作。


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