数据库完整性:在DB或App Logic中管理它?

时间:2012-03-23 08:18:38

标签: database separation-of-concerns

通常,当我编写使用DB的应用程序时,我会尝试通过我使用的编程语言(在我的例子中是Java)确保数据是一致的,而不是数据库本身。这就是为什么:

  1. 数据管理逻辑不是“立即可见的”,也就是说,它不是(至少)我习惯的那种代码。
  2. 很难将DB代码保持在源代码管理之下。
  3. 但是,我可以看到在数据库端保持“数据完整性”逻辑的重点,主要是相同的数据库可以被其他应用程序(或您自己的应用程序的其他人编写的部分)使用而没有风险腐蚀它。

    这是什么“正确的方法”?是否有任何标准可以选择将其存储在数据库中还是存储在应用程序的特殊层中?

1 个答案:

答案 0 :(得分:2)

从我的角度来看,必须在数据库中定义参照完整性。

你应该总是在那里定义它。从本质上讲,它是你最后一道防线"并确保没有外部应用程序会弄乱您的数据。

如果您的数据值得,那么从长远来看,它将被多个应用程序访问。而且您的数据很可能会比您当前正在构建的应用程序更长,而新的数据将会接管。

另外,在数据库中使用约束可以防止在手动运行SQL语句时出现人为错误(想想升级脚本,批量导入)

大多数现代数据库也可以使用约束来优化语句。通常,ORM生成的语句包含对可能并不总是需要的表的引用。具有外键约束可以帮助数据库删除它们。

以下两个链接显示了一些例子:
http://www.scarydba.com/2010/11/22/do-foreign-key-constraints-help-performance/
http://www.oracle.com/technetwork/issue-archive/2009/09-may/o39asktom-096149.html

最后但并非最不重要:他们记录您的模型。如果你在没有任何外键约束的情况下查看数据库,你就不知道这些表是如何相互关联的(如果它们能够检测到数据库中的外键约束,某些工具甚至可以帮助你编写语句)。