gMa*_*ale 5 database database-design data-driven
题
数据库ID"无意义"是一个很好的经验法则吗?相反,以一种可以一目了然地识别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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
摘要
保持ID可读和一致的优缺点是什么?您通常喜欢哪种方法?为什么?是否有公认的行业最佳实践?
--------编辑( 以下评论中有用的背景信息 ):--------
在我们的表中,主键始终是包含唯一整数的ID字段.起初,该整数是任意的.随着时间的推移,其中一些ID在开发人员/测试人员中自然具有意义.在最近的重构期间,某些开发人员也花时间让所有ID更容易识别.它使每个人的工作变得更容易100倍.由于理论上的原因,一些人(实际上并没有使用数据/代码)强烈反对.在实践中,没有一个反对意见是正确的.此外,所有使用这些数据的开发人员都认为它现在更容易维护.
我正在寻找(但没有看到)反对在以数据为中心的环境中使用可立即识别的ID的防御性论点.
Can*_*ice 20
Con:我刚刚将"Aisle Five top shelf"更改为"Aisle Six top shelf",所以现在我必须将其ID更改为61,现在我必须将"Grapes on Aisle five top shelf"的ProductLocation ID更改为10461并且哦,上帝在我的数据库中ID的架子位置ID字符串显示在哪里哦上帝谁设计ID携带意义应该是在早上四点拍摄,一切都疯了,为什么"过道七底架"有一个ID 41个模具模具.
好吧,鉴于您的10141
“苹果在第四过道”,当您最终将产品10
放在1
货架上的过道时会发生什么41
?或者该产品是1
在014
货架上的过道中,还是因为不在货架上而位于地板上的过道中的1
产品?101
41
一旦开始像这样混合数据,您通常会失去可靠提取组件的能力。人类可读的密钥固然很好,但你永远不会破坏人类形态所基于的各个 ID。
使用数据库ID编码有关行的信息有几个问题.如果您希望胡萝卜的"ID"为203,则应添加一product_id
列(例如)并将此信息放在那里.为什么?
ID唯一需要的目的是唯一标识表中的行.如果它可以提供良好的查找性能,这是一个奖励,如果它可以紧凑存储,那是另一个奖励.但它不应包含有关其标识的行中的实体的任何信息,除了该实体的唯一标识符.