Database 数据库FK约束与编程FK约束
尽管我的目标是MySQL/PHP,但为了回答我的问题,我想将其应用于与现代编程语言结合使用的任何关系数据库。另一个假设是,该语言正在利用一个现代框架,该框架在某种程度上可以隐式地处理外键约束,也可以显式地处理外键约束 我的问题:Database 数据库FK约束与编程FK约束,database,database-design,Database,Database Design,尽管我的目标是MySQL/PHP,但为了回答我的问题,我想将其应用于与现代编程语言结合使用的任何关系数据库。另一个假设是,该语言正在利用一个现代框架,该框架在某种程度上可以隐式地处理外键约束,也可以显式地处理外键约束 我的问题: 与在应用程序级别管理FK约束相比,在数据库中创建FK约束有哪些优点和缺点 从设计的角度来看,它们是否应该一起使用,还是会导致冲突 如果它们不应该一起使用,那么关于使用哪种方法,什么是“最佳实践” 注意:这是一个设计理论问题。由于可用于满足实现的技术种类繁多,我对实现
- 与在应用程序级别管理FK约束相比,在数据库中创建FK约束有哪些优点和缺点
- 从设计的角度来看,它们是否应该一起使用,还是会导致冲突
- 如果它们不应该一起使用,那么关于使用哪种方法,什么是“最佳实践”
注意:这是一个设计理论问题。由于可用于满足实现的技术种类繁多,我对实现的任何细节都不感兴趣。您对数据库设计和外键概念的总体熟悉程度如何?FK是一个表中的列,用于标识另一个表中的行。(我很确定你们已经知道了。)所以FK约束是存在于DB中的东西,而不是应用程序中的东西。管理应用程序中的FK约束需要手动编码数据库中已有的功能。那你为什么要做这些体力劳动呢?此外,由于所有额外的手动编码,数据库/应用程序的交互和开发要困难得多 IMHO的最佳实践是将这些工具用于其创建目的。DB负责FKs引用完整性,应用程序不需要关心DBs的内部功能。然而,如果引用完整性是您主要关心的问题,并且您正在使用MySQL和MyISAM引擎,而MyISAM引擎不支持,那么您必须手动签入应用程序(或者可能使用我不熟悉的DB触发器)。请记住,当您在应用程序中执行所有类型的检查时,您仍然必须访问数据库,因此,如果数据库能够处理引用完整性检查,那么您将使用比实际需要更多的资源。(当然,简单的解决方案是开始使用,但在这个答案变得过于面向产品之前,我将在这里停止) 因此,让DB处理FK约束的一些优点是:
- 假设父表中当前有一行,而子表中没有相应的行
- 事务T1在子表中插入一行,但尚未提交。它可以做到这一点,因为父表中有一个对应的行
- 事务T2删除父行。它可以做到这一点,因为从它的角度看不存在子行(T1尚未提交)
- T1和T2提交
- 此时,您有一个子行没有父行(即引用完整性被破坏)
另见: 在数据库中创建FK约束的优缺点是什么 而不是在应用程序级别管理它们 使用db强制FKs的一些优点: