【发布时间】:2010-10-02 14:50:22
【问题描述】:
我一直在阅读 Dan Chak 的“Enterprise Rails”一书,它让我思考:您是否认为您应该在数据库级别和应用程序级别都有数据约束?或者您是否觉得与 Ruby on Rails 之类的固执己见的框架相似——数据库只是数据的“愚蠢存储库”,所有检查都应该在你的应用程序中完成(我不想在这里单独列出 RoR——我是我自己是 Rails 的忠实粉丝,但我不同意它对数据库的处理方式)?
就个人而言,我认为您应该同时拥有它们,以确保您的数据库和应用程序得到很好的保护。我的意思是你应该使用非空约束,如果知道的话,给你的字段一个长度(而不是将它们全部留在 nvarchar(255) ),有诸如 之类的东西外键、检查约束和触发器在您的数据库上,然后还通过应用程序中的业务逻辑规则强制执行。 IMO 这使您的应用程序通过其用户界面变得健壮,并且还可以防止可能直接访问数据库的人。
我最常看到的反驳是,它需要相当于重复逻辑的东西;一次在数据库级别,一次在应用程序级别 -- 假设您有一个检查约束来验证是否输入了产品的 SKU(即它的长度大于零)。
您现在还需要在业务逻辑中包含验证方法,以确保用户输入的值的长度大于零,还可能需要一些客户端 Javascript 在用户键入数据时捕获错误。
我并不认为这是一件坏事 - 是的,您有一些重复的逻辑,但最终结果是“数据库作为堡垒”的心态,因为如果您考虑一下,您的数据是唯一最重要的部分你的申请;毕竟,如果数据很容易被破坏和破坏,那么您闪亮的新 Web 2.0 应用程序有什么用?
您对此有何看法?数据库应该是像诺克斯堡这样的坚不可摧的堡垒,还是一个由激光守卫的开放式保险箱?换句话说,您应该牺牲一些重复的逻辑来确保数据模型的安全,还是将所有内容留给您的应用程序并仅使用数据库来存储数据?
【问题讨论】:
-
在 OO 中,除了对象之外,您还使用其他语言来维护其自身的完整性。我希望数据库也能做到这一点。
-
Database constraints are law; application logic constraints are advice. -
我什至会走得更远,@Lukasz,它们是不能被打破的定律(想想热力学第二定律而不是调节车速的定律)。
标签: database-design