当前位置:首页 > 问答 > 正文

给SQL数据库字段起名字到底有什么讲究和规范啊,怎么才能不乱又好理解呢

给数据库字段起名字,这事儿说大不大,说小不小,名字起得好,以后自己看、同事看,都一目了然,维护起来顺风顺水;名字起得烂,过几个月自己都可能看不懂当初写的是啥,更别提团队协作了,简直就是给未来埋雷,要想不乱又好理解,核心就一句话:让名字自己会说话

最最基础的一条,也是几乎所有编程领域的共识,就是用英文单词,不要用拼音缩写,这是有血的教训的,很多早期的国内项目用了拼音缩写,比如把“用户标识”写成“YHBZ”,把“更新时间”写成“GXSJ”,短时间内可能项目组的人都懂,但一旦人员流动,新来的同事看到“GXSJ”可能得猜半天是“更新时间”还是“共享数据”,极大降低了沟通和维护效率,像亚马逊云科技在它的数据库最佳实践中就明确建议使用描述性的英文名称(来源:亚马逊云科技官方文档),哪怕英文不好,用翻译软件查一下,写成 user_id, update_time,也比拼音缩写强一百倍。

要讲究一致性,这是避免“乱”的关键,你得在整个数据库里定下一套规矩,并且所有人都遵守。

  • 单复数:表名用复数还是单数?Users 还是 User?没有绝对的对错,但必须统一,通常更推荐用复数,因为表是存放多条记录的集合。
  • 前缀/后缀:要不要用前缀来区分不同类型的表?比如所有业务表都用 biz_ 开头,所有系统配置表都用 sys_ 开头?这能让人一眼看出表的归属,字段名也一样,比如所有的日期时间字段,是统一用 _time create_time, update_time)还是用 _at created_at, updated_at)?选一种,然后坚持下去。
  • 布尔字段命名:表示“是否”的字段,最好用能清晰表达真假的词汇前缀。is_active(是否激活)、has_deleted(是否删除)、can_login(能否登录),避免使用意义模糊的词,status,除非它是有明确枚举值的状态码。

清晰和具体非常重要,字段名要尽可能完整地描述它存储的数据内容,不要为了省事而过度简化,举个例子,一个产品表里有个价格字段,你如果直接叫 price,就可能产生歧义:是原价还是折扣价?是人民币价格还是美元价格?更好的命名是 original_price(原价)和 sale_price(售价),如果涉及多币种,甚至可以写成 price_usd,再比如,一个“订单”表里需要记录用户的收货地址和发票地址,如果你只写两个 address,那就乱套了,应该明确区分成 shipping_addressbilling_address,这种思想在《SQL反模式》这本书里被反复强调,即避免泛化的设计,追求精确的表达(来源:《SQL反模式》)。

还有一点是关于避免使用数据库关键字,虽然像 name, order, group, desc 这样的词做字段名在技术上可能可行(通常用反引号或引号括起来),但这会带来很多麻烦,你在写查询语句的时候,很容易和SQL本身的关键字冲突,导致语法错误或难以阅读,保险起见,用 user_name 代替 name,用 order_dateproduct_group 来代替那些敏感词。

说说长度和格式,字段名不能太长,否则写起来麻烦,但也不能太短,失去可读性,折中的办法是使用蛇形命名法,也就是用小写字母,单词之间用下划线 _ 连接,customer_first_name,这种格式在数据库领域是事实上的标准,比驼峰命名法(如 customerFirstName)更常见,因为SQL本身不区分大小写,在大多数数据库系统中,下划线是更清晰的分隔符,马丁·福勒等软件工程大师在讨论数据库设计时,也常默认使用这种命名约定(来源:马丁·福勒的博客及相关著作)。

给SQL字段起个好名字,不是什么高深的学问,靠的是细心和约定,核心就是:用清晰的英文、保持整体一致、追求具体无歧义、避开关键字、采用通用的蛇形命名,刚开始设计的时候多花几分钟思考命名,能为你和你的团队在未来的几年里节省无数个小时的困惑和调试时间,把这当成一种投资,绝对是稳赚不赔的。

给SQL数据库字段起名字到底有什么讲究和规范啊,怎么才能不乱又好理解呢