V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
marcosteam
V2EX  ›  数据库

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

  •  
  •   marcosteam · 117 天前 · 1358 次点击
    这是一个创建于 117 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    2. 这个东西放 redis 里面,然后落地到 mysql json 列不行?
    hjahgdthab750
        3
    hjahgdthab750  
       117 天前
    @chanchan #1 json 类型
    marcosteam
        4
    marcosteam  
    OP
       117 天前
    @hjahgdthab750 如果是放到 Redis 里面的话,KV 应该怎么设?
    whajcf
        5
    whajcf  
       117 天前   ❤️ 1
    如果只是等级权限 二进制不香?
    marcosteam
        6
    marcosteam  
    OP
       117 天前
    @whajcf 这个也不知道怎么做...能不能细说?
    nekoneko
        7
    nekoneko  
       117 天前
    上 pgsql
    pipicat
        8
    pipicat  
       117 天前
    设置每个等级二级制为,按为与。数据库只用存 1 个与结果
    Rache1
        9
    Rache1  
       117 天前   ❤️ 1
    😏 拆一张表出来,哈哈
    marcosteam
        10
    marcosteam  
    OP
       117 天前
    @pipicat 也就是数据的每一位代表不同等级 VIP 的可见状态,1 可见 0 不可见,然后按位与筛选出结果不为 0 的条目?
    NizumaEiji
        11
    NizumaEiji  
       117 天前
    ES ?
    meshell
        12
    meshell  
       117 天前
    按位吧,和我们做得不平台显示的 banner 一样的。那个平台显示,那个不显示。一个道理
    masterclock
        13
    masterclock  
       117 天前   ❤️ 2
    按 VIP 等级查询?也许很快就会出现 按 VIP 等级、用户注册时间、年龄、性别、冥王星轨道位置 的查询条件呢。
    基于数据库查询实现前,应该再考虑一下。
    ch2
        14
    ch2  
       117 天前
    掩码了解一下
    pipicat
        15
    pipicat  
       117 天前
    @marcosteam #10 参考一下 https://www.v2ex.com/t/795373?p=1#r_10784298 比如等级 1 为 1 等级 2 为 1<<1 。商品属性存这个商品所有等级的位与的结果。查询的时候取人的等级 (mFlags & mask) == mask;
    marcosteam
        17
    marcosteam  
    OP
       117 天前
    @pipicat 懂了,谢谢!
    marcosteam
        18
    marcosteam  
    OP
       117 天前
    @pipicat 还有一个问题,这种方法的扩展性比较一般,如果我想加入一个新的用户组是不是要整个表都要更新一次?
    adoal
        19
    adoal  
       117 天前 via iPhone
    正经一点的关系数据库,比如 PostgreSQL,数组内查询都不成问题。
    beginor
        20
    beginor  
       117 天前 via Android
    pg+1,用上就不想回头了
    xuanbg
        21
    xuanbg  
       116 天前
    不能用子表存集合里面的数据吗?
    hjahgdthab750
        22
    hjahgdthab750  
       116 天前
    @marcosteam #4 看你们业务拉,直接 goodID#visble [2,3]
    rekulas
        23
    rekulas  
       116 天前
    不推荐二进制,虽然节约了空间,但是直观性扩展性不高,而且要利用索引也麻烦
    加个映射表吧
    no1xsyzy
        24
    no1xsyzy  
       116 天前
    关系型数据库的标准做法是把数组转置成列向量
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1154 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:21 · PVG 03:21 · LAX 11:21 · JFK 14:21
    ♥ Do have faith in what you're doing.