在php应用程序的Mysql表创建或链接表中包含外键?

时间:2013-07-03 23:27:19

标签: php mysql database-design

在为潜在的PHP / Mysql应用程序创建数据库之前,我在MySql Workbench中查看了我的表,并注意到在构建每个表时包含外键的选项。

在创建数据库时,是否应该在构建表的SQL语句中声明外键?或者......我应该只链接SQL页面中的SQL select和insert语句中的表吗?为什么或者为什么不?

3 个答案:

答案 0 :(得分:0)

首先了解外键约束的重要性。

http://www.w3schools.com/sql/sql_foreignkey.asp

此外,我始终相信在您的数据库中工作更难以编码

答案 1 :(得分:0)

在我分析的每个数据库中都缺少外键约束,数据搞砸了。子表存在于引用已在父表中删除的行的子表中。

如果没有外键约束,这些“孤儿”行很难防止,甚至很难检测到。你基本上必须依靠在你的应用程序中编写完美的代码 - 这是一个有风险的东西依赖! ; - )

我在这里写了关于如何自动检测孤儿行的信息:http://www.mysqlperformanceblog.com/2011/11/18/eventual-consistency-in-mysql/

答案 2 :(得分:0)

简而言之,您应该尝试在数据库中编写正确的应用程序代码具有外键。

外键是确保数据完整性的最重要方法之一(它们基本上可以防止悬空指针 1 )。这几乎是在并发环境中执行此操作的唯一正确的方式。

依赖在应用程序逻辑上始终写入正确的数据是脆弱的 2 。数据库本身应该尽可能地保护自己免受不良数据的影响,主要是通过声明完整性约束 3 ,也可能通过非声明性手段 4


1 我在这里松散地使用“指针”一词。

2 即使其中一个写入数据库的应用程序中的错误也会使数据处于危险之中。如果多个客户试图同时写入相关数据,可能会出现难以捕捉的竞争条件;锁定可能是必要的,影响可伸缩性。

3 域的完整性(类型系统和CHECK约束),密钥的完整性(PRIMARY KEY和UNIQUE约束)和参照完整性(FOREIGN KEY约束)。

4 例如触发器和存储过程。