【发布时间】:2011-02-09 22:24:06
【问题描述】:
问题
数据库 ID“无意义”是否是一个好的经验法则?相反,以一种一眼就能认出的方式构建 ID 是否有显着的好处?有什么好处和坏处?
背景
我刚刚与我的同事就我们数据库中 ID 的一致性进行了辩论。我们有一个利用 Spring 的数据驱动应用程序,因此我们很少需要更改代码。这意味着,如果出现问题,数据更改通常是解决方案。
我的论点是,通过使 ID 保持一致和可读,我们可以为自己节省大量时间和长期的麻烦。一旦设置了 ID,它们就不必经常更改,如果操作正确,未来的更改将不会很困难。我同事的立场是,ID 永远不重要。将信息编码到 ID 中违反了数据库设计策略,并且保持它们有序需要额外的工作,“我们没有时间去做”。我在网上找不到任何支持这两种立场的东西。所以我要求助于 SA 的所有大师!
示例
想象一下这个表示杂货店食物的简化数据库记录列表,第一组表示在 ID 中编码的数据,而第二组则没有:
ID 的含义:
Type
1 Fruit
2 Veggie
Product
101 Apple
102 Banana
103 Orange
201 Lettuce
202 Onion
203 Carrot
Location
41 Aisle four top shelf
42 Aisle four bottom shelf
51 Aisle five top shelf
52 Aisle five bottom shelf
ProductLocation
10141 Apple on aisle four top shelf
10241 Banana on aisle four top shelf
//just by reading the ids, it's easy to recongnize that these are both Fruit on Aisle 4
ID 没有意义:
Type
1 Fruit
2 Veggie
Product
1 Apple
2 Banana
3 Orange
4 Lettuce
5 Onion
6 Carrot
Location
1 Aisle four top shelf
2 Aisle four bottom shelf
3 Aisle five top shelf
4 Aisle five bottom shelf
ProductLocation
1 Apple on aisle four top shelf
2 Banana on aisle four top shelf
//given the IDs, it's harder to see that these are both fruit on aisle 4
总结
保持 ID 的可读性和一致性有哪些优点和缺点?您通常更喜欢哪种方法,为什么?是否有公认的行业最佳实践?
-------- 编辑( 来自 cmets 的有用背景信息,如下 ):--------
在我们的表中,主键始终是一个包含唯一整数的 ID 字段。起初,这个整数是任意的。随着时间的推移,其中一些 ID 在开发人员/测试人员中自然而然地具有了意义。在最近的一次重构中,某些开发人员还花时间让所有 ID 更易于识别。它让每个人的工作轻松了 100 倍。有些人(实际上并不使用数据/代码)出于理论上的原因强烈反对。在实践中,这些反对意见中没有一个是成立的。此外,所有使用这些数据的开发人员都认为现在维护起来要容易得多。
我正在寻找(但还没有看到)反对在以数据为中心的环境中使用可立即识别的 ID 的站得住脚的论据。
【问题讨论】:
-
将关系信息编码到 ID 中似乎很愚蠢,因为关系数据库本质上会为您维护这一点。另外,数据库ID不一定是人类可读的。如果您需要易于人类解析的关系数据,则可以构建查询/视图来显示数据,或者考虑使用不同的机制来存储数据。考虑人类可解析信息的唯一真正原因是用于调试 (imo)
-
@Alan:我以前从未做过社区 Wiki。如果我想,我将如何转换这个问题?甚至可以转换吗?
-
@Alan:您已经完全触及问题的核心:如果您将花费大量时间调试数据并且几乎不需要努力使 ID“一致”和“可读, ” 那么这样做真的“邪恶”吗?
-
@gmale 我不认为这个愚蠢的问题可以得出 11 个答案,其中一个得到高度评价。问题中一定有某些东西。
-
请不要破坏您的问题。
标签: database database-design data-driven