6

假设您在 MySQL 数据库中有两个如下表:

表人:

  primary key: PERSON_ID,
  NAME,
  SURNAME, etc.

表地址:

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

如果您管理行的创建(在两个表中)和通过 PHP 检索数据,您还需要在数据库中创建物理关系吗?如果是,为什么?

4

4 回答 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)
)
于 2012-10-26T11:39:10.297 回答
5

严格来说:您不需要使用FK。仔细的索引和编写良好的查询似乎就足够了。然而,FK 和 FK 约束在保护数据一致性方面非常有用(例如,避免孤立数据)

假设您编写了您的应用程序,一切都经过了测试,它就像一个魅力。太好了,但谁能说每次必须改变某些事情时你都会在附近呢?您是要自己维护代码,还是其他人最终可能会进行快速修复/调整或实现​​其他功能?实际上,你永远不会是唯一一个编写和维护代码的人,即使你是唯一一个维护代码的人,随着时间的推移,你几乎肯定会遇到错误......
外键通知两者您的同事和您来自 tbl1 的数据取决于来自 tbl2 的数据,反之亦然。就像注释一样,这使应用程序更易于维护。

错误更容易检测:创建一个从 tbl1 删除记录的方法,但忘记更新 tbl2 以反映对第一个 tbl 所做的更改。发生这种情况时,数据已损坏,但导致此问题的查询不会导致错误:SQL 在语法上是正确的,并且它执行的操作是所需的操作。这些错误可能会隐藏很长一段时间,当发现时,天知道有多少数据被破坏了......

最后,这是一个经常使用的论点,如果与数据库的连接在一系列更新/删除查询的中途丢失怎么办?FK 约束使您能够级联某些操作。我实际上并没有看到这种情况发生,但我知道有人不编写代码来防止这种情况
删除或更新多个关系记录,但在中途,与数据库的连接由于某种原因被切断. 您可能已经编辑了 tbl2,但在发送到 tbl1 的查询之前连接已丢失。同样,我们最终得到损坏的数据。
FKCASCADE在这里非常有用。从 tbl1 中删除,并设置一个ON DELETE CASCADE规则,这样你就可以放心把相关记录从tbl2中删除了。在同样的情况下,ON DELETE RESTRICT, 也可以是一个相当有用的规则。

请注意,FK 并不是生命、宇宙和所有事物的最终答案(众所周知,它是 42),但它们是真正的关系数据库设计的重要组成部分。

于 2012-10-26T12:39:27.473 回答
2

参照完整性是您应该阅读和理解的文章。

于 2012-10-26T11:39:29.807 回答
1

有两种方法

-第一个是处理编码端的所有事情管理删除或更新记录的事情,但是当您使用外键时,您正在执行关系并且 Db 不允许您删除具有外键约束的记录,尤其是当您不这样做时不想删除与之相关的记录,在某些情况下您需要执行此类任务。

-第二种方法是在 Db 端管理事物。如果您在数据库中有一对多或多对多的关系,外键将非常有用。他们也有一些很好的行动 - RESTRICT, CASCADE, SET NULL, NO ACTION 这些可以为你做一些工作

于 2014-03-01T09:24:41.453 回答