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


Include foreign keys in Mysql table creation or link tables in php application?

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

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

首先了解外键约束的意义。

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

此外,我一直相信在数据库中工作更难编码更少

在我分析过的每个缺少外键约束的数据库中,数据都是混乱的。子表中存在引用父表中已删除行的行。

如果没有外键约束,这些"孤立"行很难防止,甚至很难检测。你基本上必须依赖于在应用程序中编写完美的代码——这是一件有风险的事情!;-)

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

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

外键是确保数据完整性的最重要方法之一(它们本质上保护数据不受悬挂指针的影响)。在并发环境中,这几乎是唯一正确的性能方式。

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


1我在这里松散地使用了"指针"这个词

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

3域的完整性(类型系统和CHECK约束)、密钥的完整性和引用完整性(FOREIGN key约束)

4例如触发器和存储过程