一对多的时候,用逗号分隔,存id,还是建表存id?

做项目的时候,有种情况是这样的,一个员工,简称admin,对应三个职位abc,可多选.
也就是说,他可以是a,也可以是b,也可以是ab,abc,bc,这样子
每次碰到这种业务的时候,都很纠结,该以什么方式去存储他们之间的关系,有时候为了懒省事,直接就以逗号分隔,以这样的形式 a,b,c存入数据库中,取出来的时候,对其进行逗号切分处理,然后再根据abc各自进行处理,有时候有些特殊的查询,会用到find_in_set这种关键字查询,意思就是,字段是否包含其中一种.能实现业务,也想不到有什么不合理的地方.
另外就是新建一张表,存admin的id,以及a,或者b,或者c,这样的话,就要去新建表,建实体类,就有点麻烦.而且,就觉得能用逗号存,为什么要这样存呢?一直想不明白,也找不到问题所在.索性有时候用逗号分隔,有时候就建表.
内心渐渐不安,总感觉不是很好,然后就大量百度,以求发现类似的例子,来佐证我的想法,以前也搜过,但是对于这个并没有搜到回答,今天,偶然看到一句话:
数据库尽量不要这样设计。数据库表的每一列都应该是“原子”的
感觉对,也感觉不是那么绝对.哎,不知道咋想了~~
纠结死人,有没有路过高人,给个说法
TM的,我终于想明白了,如果用逗号分隔写的话,遇到需要多表联查的话,就跪了,他只能说,一步一步的去查询,先得到字段,然后拆分,然后再去查,是不能直接使用字段值去数据库中联查的,起码我不知道.

2021.2.9:
以上的最终叙述: 不好进行关联查询是正确的,我想过一种方法,是关联的时候,在on里面能不能用包含的函数进行查询.如果可以的话,那么就可以解决关联问题.
这个猜想是可以的.只需要在关联的on条件的后面,用函数:
FIND_IN_SET进行关联即可.
例子: select * from card inner join shop on FIND_IN_SET(shop.id,card.shop_id)
这样就可以进行关联的查询.
而且,结果是准确的.
这样的话,优点就很明细,一个字段,可以代替一个表的作用.可以省去很多事情.
而且带来的缺点: 不利于从B的方面进行维护吗? 这个问题,应该也不存在.
我同样可以通过关联查询,获取我想要的结果.
逆推结果: 同样正确,这样就不存在不能关联查询的问题了.
select * from shop inner join card on FIND_IN_SET( shop.id,card.shop_id)
但是即使如此: 多对多关联依旧不够明确.
以上面例子来说:
A对象,存入了B对象切分的id,用逗号分隔,存入字段中.
那么A与B之间的关系,全部都要通过A来进行维护.
如果通过B来进行维护A和B之间的关系,就比较麻烦. 维护是指修改关系吧.
比如优惠券指定门店.
优惠券1 指定,a,b,c三家门店.
我在优惠券1中,修改优惠券1与a,b,c三家门店的关系,就比较简单.直接修改优惠券的一个值.
但是我通过a门店,去修改关系的话,就比较麻烦,无论是新增,还是删除当前门店.
都要找到那张优惠券,再把门店的id做对比,还要知道门店是新增进指定,还是去除掉.
但是如果,完全不需要在a门店端对优惠券做任何操作.那么使用逗号分隔指定门店就很舒服了.
还有: 如果B对象切分的id足够多,比如200个,再加上逗号,那么就会导致很长.存储,并且视图,都不好.
所以,如果用切分的id存储,必须满足,足够少的id.这个少,见仁见智.
待续…

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值