在为潜在的 PHP/Mysql 应用程序创建数据库之前,我在 MySql Workbench 中查看我的表,并注意到在构建每个表时包含外键的选项。
我应该在创建数据库时在构建表的 SQL 语句中声明外键吗?或者...我应该只在我的 PHP 页面中链接 SQL 选择和插入语句中的表吗?为什么或者为什么不?
在为潜在的 PHP/Mysql 应用程序创建数据库之前,我在 MySql Workbench 中查看我的表,并注意到在构建每个表时包含外键的选项。
我应该在创建数据库时在构建表的 SQL 语句中声明外键吗?或者...我应该只在我的 PHP 页面中链接 SQL 选择和插入语句中的表吗?为什么或者为什么不?
在我分析的每个缺少外键约束的数据库中,数据都是混乱的。行存在于引用已在父表中删除的行的子表中。
如果您没有外键约束,这些“孤立”行很难防止,甚至很难检测到。您基本上必须依靠在您的应用程序中编写完美的代码——这是一件有风险的事情!;-)
我在这里写了关于如何自动检测孤立行的文章:http ://www.mysqlperformanceblog.com/2011/11/18/eventual-consistency-in-mysql/
简而言之,您应该尝试编写正确的应用程序代码并在数据库中有外键。
外键是确保数据完整性的最重要方法之一(它们基本上可以防止悬空指针1)。这几乎是在并发环境中唯一正确且高效的方法。
仅依靠应用程序逻辑来始终写入正确的数据是脆弱的2。数据库本身应该尽可能地保护自己免受不良数据的影响,主要是通过声明性完整性约束3,也可能通过非声明性手段4。
1我在这里松散地使用“指针”这个词。
2即使是其中一个写入数据库的应用程序中的错误也可能使数据处于危险之中。如果多个客户端尝试同时写入相关数据,可能会出现难以捕捉的竞争条件;锁定可能是必要的,这会影响可伸缩性。
3域的完整性(类型系统和 CHECK 约束)、键的完整性(PRIMARY KEY 和 UNIQUE 约束)和参照完整性(FOREIGN KEY 约束)。
4如触发器和存储过程。