假设您在MySQL数据库中有两个如下表:
表人:
primary key: PERSON_ID,
NAME,
SURNAME, etc.
TABLE地址:
primary key: ADDRESS_ID,
foreign key: PERSON_ID,
addressLine1, etc.
如果你管理行的创建(在两个表中)和通过PHP检索数据,你还需要在数据库中创建一个物理关系吗?如果是,为什么?
答案 0 :(得分:7)
是的,一个具体原因是如果要连接表,可以更快地检索行。创建外键约束会自动在列上创建索引。
因此,表格地址'架构应如下所示(假设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)
)
答案 1 :(得分:3)
严格来说:你不需要来使用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),但它们是真正的关系数据库设计的重要组成部分。< / p>
答案 2 :(得分:1)
Referential integrity是一篇你应该阅读和理解的文章。
答案 3 :(得分:1)
有两种方式
- 第一个是处理编码端的所有事情管理删除或更新记录的事情 但是当您使用外键时,您正在强制执行该关系,并且Db不允许您删除具有外键约束的记录,尤其是当您不想删除与其相关的记录时,在某些情况下会出现需要执行此操作的情况任务。
- 第二种方式是管理Db方面的事情。如果数据库中存在1对多或多对多关系,则外键非常有用。他们还有一些很好的动作 - RESTRICT,CASCADE,SET NULL,NO ACTION那些可以为你做一些工作