以编程方式强制执行外键的优缺点

Jef*_*eff 5 database foreign-keys

仅仅通过让数据库强制执行外键,它在开发方面造成了很多麻烦.特别是在单元测试期间,由于外键约束我无法删除表,我需要按照外键约束警告不会被触发的顺序创建表.实际上,我没有看到让数据库强制执行外键约束的重点.如果应用程序设计得当,除了select查询之外,不应该有任何手动数据库操作.我只是想确保通过不在数据库中使用外键约束并将其完全留给应用程序负责来确保我不会陷入困境.我错过了什么吗?

PS我的真实单元测试(不是那些使用模拟)将丢弃现有的表,如果底层域对象的结构已被修改.

Guy*_*uck 14

根据我的经验,如果你不在数据库中强制执行外键,那么最终(假设数据库相对较大且使用频繁),你将最终得到孤立的记录.这可能在很多方面发生,但似乎总会发生.

如果索引正确,外键不应该有任何性能优势.

所以问题是,在您的数据库中拥有孤立记录的潜在损害/麻烦/支持成本/财务成本是否超过了开发和测试的麻烦?

根据我的经验,对于业务应用程序,我总是使用外键.使构建脚本正常工作只需要一次性设置成本,并且数据稳定性将超过应用程序生命周期内的成本.


Ang*_*ker 6

在数据库中强制执行规则的关键在于它是声明性的 - 例如,您不必编写大量代码来处理它.

对于您的单元测试,只需按正确的顺序删除表.你只需编写一个函数来做一次.


Bil*_*ain 6

您在开发中遇到的问题不应该推动数据库设计.不断重建数据库是开发人员用例,而不是客户用例.

此外,数据库约束有助于您的应用程序.你永远不知道你的客户会尝试做什么.不要过度,但你需要一些.