最近正在用 Golang 写一个商品管理系统,现在已经用上了 MySQL 和 Redis,现在有一个需求,就是商品对某些用户的等级不可见。
例:某商品的可见 VIP 等级为 [2,3]
,即该商品只对 VIP2 和 3 等级的用户组开放购买申。
我初步搜索了一下,好像 MySQL 对数组元素的查询是比较麻烦的,鉴于这个查询比较频繁,且项目还在早期开发阶段,是不是应该尽早进入 MongoDB?
1 chanchan 2021-08-12 16:31:01 +08:00 ?? mysql 有数组类型吗 |
![]() | 2 qW7bo2FbzbC0 2021-08-12 16:32:41 +08:00 1. 5.7.22+版本对支持 array in 的逻辑查询,但是如果想用索引加速查询,不太能做得到或者麻烦。 2. 这个东西放 redis 里面,然后落地到 mysql json 列不行? |
![]() | 3 qW7bo2FbzbC0 2021-08-12 16:33:04 +08:00 @chanchan #1 json 类型 |
![]() | 4 marcosteam OP @hjahgdthab750 如果是放到 Redis 里面的话,KV 应该怎么设? |
5 whajcf 2021-08-12 16:41:35 +08:00 ![]() 如果只是等级权限 二进制不香? |
![]() | 6 marcosteam OP @whajcf 这个也不知道怎么做...能不能细说? |
![]() | 7 nekoneko 2021-08-12 16:46:27 +08:00 |
8 pipicat 2021-08-12 16:49:43 +08:00 设置每个等级二级制为,按为与。数据库只用存 1 个与结果 |
9 Rache1 2021-08-12 17:03:20 +08:00 ![]() 拆一张表出来,哈哈 |
![]() | 10 marcosteam OP @pipicat 也就是数据的每一位代表不同等级 VIP 的可见状态,1 可见 0 不可见,然后按位与筛选出结果不为 0 的条目? |
![]() | 11 NizumaEiji 2021-08-12 17:12:08 +08:00 ES ? |
![]() | 12 meshell 2021-08-12 17:12:49 +08:00 按位吧,和我们做得不平台显示的 banner 一样的。那个平台显示,那个不显示。一个道理 |
![]() | 13 masterclock 2021-08-12 17:16:23 +08:00 ![]() 按 VIP 等级查询?也许很快就会出现 按 VIP 等级、用户注册时间、年龄、性别、冥王星轨道位置 的查询条件呢。 基于数据库查询实现前,应该再考虑一下。 |
![]() | 14 ch2 2021-08-12 17:17:20 +08:00 掩码了解一下 |
15 pipicat 2021-08-12 17:18:03 +08:00 @marcosteam #10 参考一下 t/795373?p=1#r_10784298 比如等级 1 为 1 等级 2 为 1<<1 。商品属性存这个商品所有等级的位与的结果。查询的时候取人的等级 (mFlags & mask) == mask; |
16 pipicat 2021-08-12 17:19:10 +08:00 |
![]() | 17 marcosteam OP @pipicat 懂了,谢谢! |
![]() | 18 marcosteam OP @pipicat 还有一个问题,这种方法的扩展性比较一般,如果我想加入一个新的用户组是不是要整个表都要更新一次? |
![]() | 19 adoal 2021-08-12 21:00:50 +08:00 via iPhone 正经一点的关系数据库,比如 PostgreSQL,数组内查询都不成问题。 |
![]() | 20 beginor 2021-08-12 23:04:27 +08:00 via Android pg+1,用上就不想回头了 |
![]() | 21 xuanbg 2021-08-13 06:41:08 +08:00 不能用子表存集合里面的数据吗? |
![]() | 22 qW7bo2FbzbC0 2021-08-13 10:31:57 +08:00 @marcosteam #4 看你们业务拉,直接 goodID#visble [2,3] |
![]() | 23 rekulas 2021-08-13 13:22:48 +08:00 不推荐二进制,虽然节约了空间,但是直观性扩展性不高,而且要利用索引也麻烦 加个映射表吧 |
![]() | 24 no1xsyzy 2021-08-13 15:10:35 +08:00 关系型数据库的标准做法是把数组转置成列向量 |