【发布时间】:2014-12-09 08:38:32
【问题描述】:
数据库自动增量还是代码自动增量哪个更好? 我的导师刚刚告诉我,让数据库尽可能“愚蠢”更好,让程序完成所有工作。不是反过来吗?
【问题讨论】:
数据库自动增量还是代码自动增量哪个更好? 我的导师刚刚告诉我,让数据库尽可能“愚蠢”更好,让程序完成所有工作。不是反过来吗?
【问题讨论】:
我认为让数据库“尽可能愚蠢”是错误的做法。您越是锁定数据库以防止出现不连贯的数据,您就越能保持平静。
数据库为您提供了许多工具(如外键),无需使用代码即可确保数据的完整性和一致性。如果您的代码不完美,它可以保护您。更好的是,如果有人使用您的数据库编写新代码,他可以通过查看其结构知道您创建数据库时的意图。
所以,回答你的问题,对我来说,我认为自动增量更好。数据库可以轻松管理此任务,并为您解除此任务。
【讨论】:
我同意数据库应该尽可能“愚蠢”,无论如何 autoinc 是一个例外,就好像你把这个任务留给你冒着很多冲突风险的代码一样。 想象一下需要增加相同字段的两个线程/进程:您必须手动处理冲突。
具有 2 个流程的工作流程:
1. p1 get the field value and put in a variable (var==FIELD==0)
2. p2 get the same field (var==FIELD==0)
3. p1 increment the value (var++)
4. p1 store the value (FIELD==1)
SCENARIO 1
5.a p2 store the value as is (he "think" nothing changed) (FIELD=0) !!! ERROR reset value
SCENARIO 2
5.a p2 increment the value (var++)
5.b p2 store the value (FIELD==1) !!! ERROR lost 1 increment
每个“规则”和最佳实践都有其例外,您需要分析上下文以获得正确的选择。
【讨论】:
数据库列中自动增量的问题是应用程序不知道该值,因此需要额外的客户端-服务器通信来获取它。这可能会减慢您的应用程序。它还限制了某些类型的继承映射。使用其他一些增量方法(序列)可能会改善这一点,但缺点是表 ID 中的间隙。 请阅读 this 优秀帖子,了解基本自动增量的替代方案。
【讨论】: