本文正在参加「技术专题19期 漫谈数据库技术」活动
前言
在开发中进行表设计的时候, 都有可能会遇到某些字段不好定义的问题, 数据分开按最小粒度存显得过于冗余, 如果按照大粒度存则过于耦合, 不利于后面使用维护和拓展, 这时候你们会怎么选择呢?
事件
前因
同事有一张存储国家代码和名称的数据表我在使用, 主要是通过 countryCode 去取出对应展示的国家英文名, 但是产品有个需求是要在英文后面带上国家本土语言进行展示, 比如 Pakistan (اسلامی جمہوریہ پاکستان)这种的, 还要支持对应的模糊搜索, 于是我们就对表的设计产生了分歧(其实是我对他的表设计有意见哈哈);
需要支持的功能
- 通过英文和本地语言进行模糊搜索;
- 通过countryCode获取英文名和本地名进行展示;
- 通过countryCode只获取英文名进行展示;
同事的实现
| countryCode | countryName |
|---|---|
| pk | Pakistan (اسلامی جمہوریہ پاکستان) |
优点:
- 资源占用小;
- 实现省事, 不用维护多个字段;
缺点:
- 使用麻烦, 需要使用方/自己单独提供方法拆分;
- 不利于拓展, 后续如果增加模糊搜索关键词需要单独新增字段;
我的实现
| countryCode | countryName | localName | fullText |
|---|---|---|---|
| pk | Pakistan | اسلامی جمہوریہ پاکستان | Pakistan (اسلامی جمہوریہ پاکستان) |
优点:
- 字段为最小粒度, 方便维护和拓展;
- 便于使用;
缺点:
- 资源占用会多一些, 因为会存冗余数据;
结论
首先确定一点, 不谈需求的功能实现都是扯淡!
如果只是按照功能实现的要求的话, 我们设计的表都可以实现功能, 区别在于考虑的方向不一样;
当然我坚持我的意见, 易维护和扩展以及便于使用是我追求的, 毕竟你也不知道产品下一秒会提出什么奇葩需求, 现在偷懒就是给以后找罪受;
也当然, 他也坚持他的意见, 认为后续不太可能会增加字段, 不需要存那么多的冗余数据, 使用方面的话单独给我提供了个方法查询;
结语
那么问题来了, 如果是你们会怎么去设计这个表呢? 是宁愿多存冗余数据也要保证解耦, 方便后续扩展? 还是节约资源, 以最小的成本实现功能呢?