表设计中的耦合与冗余

801 阅读2分钟

本文正在参加「技术专题19期 漫谈数据库技术」活动

前言

在开发中进行表设计的时候, 都有可能会遇到某些字段不好定义的问题, 数据分开按最小粒度存显得过于冗余, 如果按照大粒度存则过于耦合, 不利于后面使用维护和拓展, 这时候你们会怎么选择呢?

事件

前因

同事有一张存储国家代码和名称的数据表我在使用, 主要是通过 countryCode 去取出对应展示的国家英文名, 但是产品有个需求是要在英文后面带上国家本土语言进行展示, 比如 Pakistan (اسلامی جمہوریہ پاکستان)这种的, 还要支持对应的模糊搜索, 于是我们就对表的设计产生了分歧(其实是我对他的表设计有意见哈哈);

需要支持的功能

  1. 通过英文和本地语言进行模糊搜索;
  2. 通过countryCode获取英文名和本地名进行展示;
  3. 通过countryCode只获取英文名进行展示;

同事的实现

countryCodecountryName
pkPakistan (اسلامی جمہوریہ پاکستان)

优点:

  1. 资源占用小;
  2. 实现省事, 不用维护多个字段;

缺点:

  1. 使用麻烦, 需要使用方/自己单独提供方法拆分;
  2. 不利于拓展, 后续如果增加模糊搜索关键词需要单独新增字段;

我的实现

countryCodecountryNamelocalNamefullText
pkPakistanاسلامی جمہوریہ پاکستانPakistan (اسلامی جمہوریہ پاکستان)

优点:

  1. 字段为最小粒度, 方便维护和拓展;
  2. 便于使用;

缺点:

  1. 资源占用会多一些, 因为会存冗余数据;

结论

首先确定一点, 不谈需求的功能实现都是扯淡!
如果只是按照功能实现的要求的话, 我们设计的表都可以实现功能, 区别在于考虑的方向不一样;
当然我坚持我的意见, 易维护和扩展以及便于使用是我追求的, 毕竟你也不知道产品下一秒会提出什么奇葩需求, 现在偷懒就是给以后找罪受;
也当然, 他也坚持他的意见, 认为后续不太可能会增加字段, 不需要存那么多的冗余数据, 使用方面的话单独给我提供了个方法查询;

结语

那么问题来了, 如果是你们会怎么去设计这个表呢? 是宁愿多存冗余数据也要保证解耦, 方便后续扩展? 还是节约资源, 以最小的成本实现功能呢?