在Mysql表创建中包含外键,还是在php应用程序中包含链接表?

在Mysql表创建中包含外键,还是在php应用程序中包含链接表?,php,mysql,database-design,Php,Mysql,Database Design,在为潜在的PHP/Mysql应用程序创建数据库之前,我在Mysql Workbench中查看了我的表,并注意到在构建每个表时包含外键的选项 在创建数据库时,是否应该在构建表的SQL语句中声明外键?或我应该在PHP页面中链接SQL select和insert语句中的表吗?为什么 首先了解外键约束的意义 此外,我一直认为在数据库中工作更难编码,在我分析过的每个缺少外键约束的数据库中,数据都是乱七八糟的。子表中存在引用已在父表中删除的行的行 如果没有外键约束,这些孤立行很难防止,甚至很难检测。您基本上

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


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

首先了解外键约束的意义


此外,我一直认为在数据库中工作更难编码,在我分析过的每个缺少外键约束的数据库中,数据都是乱七八糟的。子表中存在引用已在父表中删除的行的行

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


我在这里写过如何自动检测孤立行:

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

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

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

我在这里松散地使用了单词pointer

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

3域类型系统的完整性和检查约束、密钥主键和唯一性约束的完整性以及引用完整性外键约束

4例如触发器和存储过程