生成数据库ID的最佳策略是什么?使用数据库生成器使用自定义生成器?每个的优点和缺点是什么?使用应用程序ID生成器与数据库ID生成器
回答
DB生成:
- 易确保它的独特
- 需要额外的往返(你必须阅读生成的ID后面)
- 通常非常简单(序列)
- 当事务回滚,差距可能出现在序列中(感谢Kristen指出了这一点)。
的App ID生成
- 可以像你需要(例如,您可以编码对象类型的ID,如果你想)
- 很难做出唯一的(除非你使用复杂的UUID)
- 你甚至可以不说话的DB
[编辑]由于UUID的相当昂贵(在许多数据块,指数fragmenta没有原生支持分配ID重刑等),大多数应用程序使用基于数据库的发电机。
要记住的另一件事是,并非所有数据库插入都来自应用程序。如果使用应用程序驱动的guid,当您收到新客户并且必须从最后一个供应商迁移100,000条记录时,真的会伤害到您。
对不起,我不明白你的答案。任何人都可以清理那个吗? – bastianneu 2009-08-31 15:42:24
关键是,如果您在数据库之外的任何位置生成标识符,则会使数据处于风险之中。 – HLGEM 2009-08-31 17:50:35
+1,这取决于你的设置以及有多少不同与你互动系统,它可能无法保证所有的在你的数据库中的记录会从你的应用程序中产生。您可能会在将来的某个时间点需要合并来自外部数据源的数据,或者作为一次性迁移(如HLGEM所建议的),或者作为批量加载过程的一部分。无论哪种情况下,如果您的ID来自应用程序中,那么加载这些记录将会困难得多。你可以有一个Web服务或其他类型的API,但这会对性能产生影响。 – 2009-08-31 19:37:05
我认为最重要的是你选择一些可以被你的企业有用的标识符。例如,DMV将您的许可证号码放在卡片上,如果您忘记了钱包并记住了该号码,它可以用来验证您的身份(例如,当警察拉过来时)。你不会在卡上放置UUID。
从您的业务隐藏标识符可能会造成很多混淆,因此选择一些您不介意告诉客户,客户或业务合作伙伴的内容。我并不是说每个人都应该能够记住它,但是如果你正在查看收据(例如),至少应该可以通过电话向某人阅读。
当然,性能也有例外,但这些应谨慎使用,不得与业务可见标识符混淆。
查看我的相关blog post
+1不错的阅读。感谢您的链接 – bastianneu 2009-09-01 08:09:40
请不要混用商业密钥和技术密钥。标识符是唯一标识对象的技术键(例如在外键中)。他们在索引上表现良好,他们很小而且一贯以某种方式。业务键(如车牌号码)是你显示什么到外面,但因为它们是不可靠的(他们可以以任何方式改变,他们遵循的现实,而不是规则),你不能依赖于他们作为主键。想想名字:当你结婚时,你的名字可能会改变。或者您可以在数据库中拥有两个具有相同出生日期的“John Smith”。 – 2009-09-01 10:00:12
@Aaron:“请不要混用商业密钥和技术密钥。”我没有把它们混淆,我专门解决了这个区别。 @Aaron:“有两个约翰史密斯出生日期相同”这是发明新标识符的商业原因,而不是技术原因。 – 2009-09-01 16:43:33
- 1. ID生成器Java
- 2. 使用NServiceBus时NHibernate ID生成器
- 3. liferay id生成器与数据库的对照
- 4. Rails应用程序生成错误:父控制器中的ID
- 5. 尝试使用油滑与新生成的ID从数据库
- 6. 非id列的生成器
- 7. 实现id生成器angularjs
- 8. 与生成的ID
- 9. 休眠和ID生成器:在哪一点生成的ID?
- 10. 使用hbm2ddl创建ID和数据库方案的共享序列生成器
- 11. 全球Facebook应用程序ID与CRM数据库集成
- 12. 使用Linq生成新时序ID
- 13. 使用Hibernate Session.doWork生成序列ID
- 14. C#在Windows窗体应用程序中从数据库生成新的ID
- 15. 由数据库触发器生成的NHibernate 1.2 Id
- 16. Android应用程序生成器否Conden
- 17. Facebook应用程序生成器
- 18. Web应用程序模板生成器
- 19. Android上的应用程序生成器
- 20. friendly_id生成ID
- 21. ORMLite ID生成
- 22. 使用System.currentTimeMillis()来安全地生成唯一的数据库ID?
- 23. 使用设计器定义的ID与自动生成的ID相比较
- 24. 为什么大多数hibernate应用程序使用序列进行id生成?
- 25. 用php生成div id
- 26. 用于为Android应用程序生成促销代码的ID
- 27. 为应用程序生成数据
- 28. jpa序列ID的生成
- 29. Hibernate生成新的Id而不是从数据库获取Id?
- 30. 如何获得自动的ID生成的ID从数据库
谢谢你的名单。是否有放置Id Generator的最佳做法?数据库发生器对我来说听起来更容易 – bastianneu 2009-08-31 09:52:45
查看我的编辑。除非您编写集群软件,否则生成器通常位于数据库中。 – 2009-08-31 11:28:23
我最喜欢这个答案,导致它的一个简单的列表,你必须考虑重要的一点。谢谢! – bastianneu 2009-09-01 08:10:44