我正在开发一个开源的PHP / MySQL应用程序
我查看了phpBB,Wordpress和其他应用程序,看看他们是否指定了外键(以确保参照完整性)
我发现他们没有
在MySQL数据库结构中指定外键是否是这些类型的应用程序中的常见做法?
答案 0 :(得分:4)
MySQL的过去版本默认使用MyISAM存储引擎,不支持外键约束。除非您明确声明表使用InnoDB存储引擎,或者更改服务器范围内的默认存储引擎,否则不会出现任何外键,设计MySQL的软件开发人员也不会费心使用外键约束。
MySQL 5.5目前处于测试阶段,最终 InnoDB将成为默认的存储引擎。因此,开箱即用支持外键约束。
是的,建议使用外键。这些约束有助于确保您的数据始终满足参照完整性。另一种方法是您的数据库逐渐填充“crumbs”或引用不再在数据库中的父行的行。这些可能导致查询和浪费的空间,低效查询的奇怪结果,并且您最终手动执行清理工作,如果您只是让数据库为您强制执行清洁,那么这将是不必要的。
评论表@Jacob:好点,但一定要阅读最近的文章,比较InnoDB和MyISAM多年前,MyISAM被认为是“快速存储引擎”,InnoDB被认为是存储引擎如果没有交易,你就不情愿地使用它。
但InnoDB在过去几年中有了显着改善,在今天的大多数情况下,InnoDB比MyISAM执行更快。
除了你提到的支持全文索引的MyISAM之外,使用MyISAM的原因越来越少。当我需要全文索引时,我要么将MyISAM表维护为InnoDB中主存储的镜像,要么使用Apache Solr。
答案 1 :(得分:1)
我不确定它有多常见,但我觉得你应该完全表达对象模型的条件,无论底层数据库是否完全支持它们。
如果您通常编写ANSI SQL,那么如果您继续添加外键约束,那么当您的数据库支持它们时,您使用支持它们的引擎,或者您移动到另一个支持它们的数据库,然后你会得到它们“免费”而不必回头试图找到所有的关系。
所以,无论如何我都会把外键放在SQL中,但那是我,而且可能不常见。
答案 2 :(得分:0)
MySQL曾经不尊重外键。除非你采取措施,否则它仍然没有。
看不见,心不在焉,对吧?
答案 3 :(得分:0)
在MySQL中,只有InnoDB支持外键,并且只支持MySQL 5.1。
编辑:InnoDB将成为MySQL 5.5中的默认存储引擎
编辑 - 忽略:参考Integrety将成为6.1中的“新功能”,根据他们的路线图:http://en.wikipedia.org/wiki/MySQL#Future_releases