小感悟:多对多关系,一定要创建关系表吗?

- 感悟:多对多关系,一定要创建关系表吗?

初学数据库时,如果出现多对多关系,那么就需要额外创建一个关系表,将两边的外键存入,以此建立连接;

但是遇到多对多关系,一定需要创建关系表吗?

就好比数据库范式在一些情况下会故意违背产生数据冗余一样,规矩是死的,业务是灵活的,所以在出现多对多的情况下需要考虑清楚是否真的有必要创建关系表;

在阿里巴巴开发手册中有这样一个规范:

image-20220614105430767

这就限制了三个表的连接查询,所以在设计表中很多大厂会避免各个表之间有太多的连接关系,因为这样·会使得业务变得复杂,并且会影响查询性能;

但是这是阿里的一个规范,还是要根据自己实际业务来进行一个判断,有没有必要额外创建关系表?增添一个冗余字段会不会更好?


比如有这样一个情景:使用不同的标签来给用户分类,这样相同标签的人能有更多交流语言;

这就涉及到了tag标签表和user用户表,并且这两张表间的关系为多对多的关系,那么是否该创建一个关系表user_tag_relation呢?又或者可以在user表中添加一个tags冗余字段用来存放各个用户的标签呢?

简单分析一下:

  • 使用关系表:记录用户和标签间的关系;
    • 好处:查询灵活;
    • 缺点:多维护一个表;
  • 在user表中添加tags字段:可以选择存入Json类型字符串,这样在代码中操作更方便;如:[“学生”,“Java”,“C++”,“求职”]
    • 好处:查询方便,不用新建表,节省开发成本;
    • 缺点:增删改操作相对麻烦;

新加冗余字段的方法可能数据量大时会存在查询效率低的问题,可以使用redis缓存解决;


总的来说还是要根据实际情况来,当然不用刻意去遵循某个规范,一定要了解业务并灵活使用,各种情景见多了就知道该怎么用了;

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YXXYX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值