如果有查询数组中元素的需求,是不是应该尽早切换到 MongoDB? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
marcosteam
V2EX    数据库

如果有查询数组中元素的需求,是不是应该尽早切换到 MongoDB?

  •  
  •   marcosteam 2021-08-12 16:27:15 +08:00 2520 次点击
    这是一个创建于 1525 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近正在用 Golang 写一个商品管理系统,现在已经用上了 MySQL 和 Redis,现在有一个需求,就是商品对某些用户的等级不可见。

    例:某商品的可见 VIP 等级为 [2,3],即该商品只对 VIP2 和 3 等级的用户组开放购买申。

    我初步搜索了一下,好像 MySQL 对数组元素的查询是比较麻烦的,鉴于这个查询比较频繁,且项目还在早期开发阶段,是不是应该尽早进入 MongoDB?

    24 条回复    2021-08-13 15:10:35 +08:00
    chanchan
        1
    chanchan  
       2021-08-12 16:31:01 +08:00
    ?? mysql 有数组类型吗
    qW7bo2FbzbC0
        2
    qW7bo2FbzbC0  
       2021-08-12 16:32:41 +08:00
    1. 5.7.22+版本对支持 array in 的逻辑查询,但是如果想用索引加速查询,不太能做得到或者麻烦。

    2. 这个东西放 redis 里面,然后落地到 mysql json 列不行?
    qW7bo2FbzbC0
        3
    qW7bo2FbzbC0  
       2021-08-12 16:33:04 +08:00
    @chanchan #1 json 类型
    marcosteam
        4
    marcosteam  
    OP
       2021-08-12 16:38:53 +08:00
    @hjahgdthab750 如果是放到 Redis 里面的话,KV 应该怎么设?
    whajcf
        5
    whajcf  
       2021-08-12 16:41:35 +08:00   1
    如果只是等级权限 二进制不香?
    marcosteam
        6
    marcosteam  
    OP
       2021-08-12 16:43:38 +08:00
    @whajcf 这个也不知道怎么做...能不能细说?
    nekoneko
        7
    nekoneko  
       2021-08-12 16:46:27 +08:00
    上 pgsql
    pipicat
        8
    pipicat  
       2021-08-12 16:49:43 +08:00
    设置每个等级二级制为,按为与。数据库只用存 1 个与结果
    Rache1
        9
    Rache1  
       2021-08-12 17:03:20 +08:00   1
    拆一张表出来,哈哈
    marcosteam
        10
    marcosteam  
    OP
       2021-08-12 17:07:09 +08:00
    @pipicat 也就是数据的每一位代表不同等级 VIP 的可见状态,1 可见 0 不可见,然后按位与筛选出结果不为 0 的条目?
    NizumaEiji
        11
    NizumaEiji  
       2021-08-12 17:12:08 +08:00
    ES ?
    meshell
        12
    meshell  
       2021-08-12 17:12:49 +08:00
    按位吧,和我们做得不平台显示的 banner 一样的。那个平台显示,那个不显示。一个道理
    masterclock
        13
    masterclock  
       2021-08-12 17:16:23 +08:00   2
    按 VIP 等级查询?也许很快就会出现 按 VIP 等级、用户注册时间、年龄、性别、冥王星轨道位置 的查询条件呢。
    基于数据库查询实现前,应该再考虑一下。
    ch2
        14
    ch2  
       2021-08-12 17:17:20 +08:00
    掩码了解一下
    pipicat
        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;
    pipicat
        16
    pipicat  
       2021-08-12 17:19:10 +08:00
    marcosteam
        17
    marcosteam  
    OP
       2021-08-12 17:36:38 +08:00
    @pipicat 懂了,谢谢!
    marcosteam
        18
    marcosteam  
    OP
       2021-08-12 18:04:58 +08:00
    @pipicat 还有一个问题,这种方法的扩展性比较一般,如果我想加入一个新的用户组是不是要整个表都要更新一次?
    adoal
        19
    adoal  
       2021-08-12 21:00:50 +08:00 via iPhone
    正经一点的关系数据库,比如 PostgreSQL,数组内查询都不成问题。
    beginor
        20
    beginor  
       2021-08-12 23:04:27 +08:00 via Android
    pg+1,用上就不想回头了
    xuanbg
        21
    xuanbg  
       2021-08-13 06:41:08 +08:00
    不能用子表存集合里面的数据吗?
    qW7bo2FbzbC0
        22
    qW7bo2FbzbC0  
       2021-08-13 10:31:57 +08:00
    @marcosteam #4 看你们业务拉,直接 goodID#visble [2,3]
    rekulas
        23
    rekulas  
       2021-08-13 13:22:48 +08:00
    不推荐二进制,虽然节约了空间,但是直观性扩展性不高,而且要利用索引也麻烦
    加个映射表吧
    no1xsyzy
        24
    no1xsyzy  
       2021-08-13 15:10:35 +08:00
    关系型数据库的标准做法是把数组转置成列向量
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5514 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 08:01 PVG 16:01 LAX 01:01 JFK 04:01
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86