V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lovepim
V2EX  ›  问与答

求助,用户标签的数据库应该怎么设计?

  •  
  •   lovepim · 2019-10-29 13:21:55 +08:00 · 4150 次点击
    这是一个创建于 1634 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,遇到一个问题:

    1、用户标签,比如年龄段、性别、职业等等,现在固定的 10 个左右,以后可能还会再加别的。

    2、商品标签,商品也打了类似的目标人群标签,标签和用户标签一样。

    之前的设计是用 mysql,用户表和商品表都存上这写标签,用标签代号比如 1001 代替,然后比对的时候循环匹配。

    现在发现这个实在不好,不能扩充标签,速度也慢,又没钱做大数据推荐那一套东西。

    求助各位,有好的解决办法吗?

    12 条回复    2019-10-31 01:18:20 +08:00
    linauror
        1
    linauror  
       2019-10-29 13:42:13 +08:00   ❤️ 1
    可分为标签表和关联表,然后用户表和商户表也缓存一下标签数据,方便列表中直接展示。根据标签搜索之类的用关联表来查询
    ggicci
        2
    ggicci  
       2019-10-29 14:53:41 +08:00   ❤️ 1
    用 mongo,这样加字段就方便了
    newtype0092
        3
    newtype0092  
       2019-10-29 15:06:55 +08:00   ❤️ 1
    bit 操作了解一下
    lovepim
        4
    lovepim  
    OP
       2019-10-29 15:55:06 +08:00
    @newtype0092 bit 是啥?
    lovepim
        5
    lovepim  
    OP
       2019-10-29 15:57:21 +08:00
    @ggicci mongo 没用过,我先学学
    newtype0092
        6
    newtype0092  
       2019-10-29 18:37:34 +08:00
    @lovepim 先学习一下位运算吧
    用二进制位的 01 状态带表示是否有某个标签,一个标签集合就能表示成一个 2 进制整数,64 位的 bit 字段就能存 64 个标签的有、无状态
    查询的时候用用户身上的标签集合和产品上的标签集合做与运算就能计算出共有的标签,也可筛选含有指定标签的用户
    lovepim
        7
    lovepim  
    OP
       2019-10-29 21:25:54 +08:00
    @newtype0092 牛啊,这个思路很省存储空间啊。就是操作起来不太方便。
    JingNi
        8
    JingNi  
       2019-10-30 06:49:56 +08:00 via iPad   ❤️ 1
    一般标签用一个独立的标签表,keyID 对应 valve 标签名还有别名,可以根据自己的需求新增表段。楼主的意思应该是如果新增一种标签,还得在用户信息表新增对应段吧,也有一种办法可以不需要增加段,用两个字段 tags [key1,key2,key3] 和 [20,男,经理]的方式储存,或{key1:20;key2:男,key3:经理}的方式,
    newtype0092
        9
    newtype0092  
       2019-10-30 10:14:18 +08:00   ❤️ 1
    @lovepim 没事又不是让你每次手动操作,下层的位操作封装好以后对上层就是透明的。
    这种方法主要目的不是节省空间,而是通过位操作进行高效的集合运算,位操作的效率相当于基本算数运算,而且不给关系型数据库的关联操作增加额外负担。
    lovepim
        10
    lovepim  
    OP
       2019-10-30 22:56:12 +08:00
    @newtype0092 我还是不太懂。假如用户有四个标签,每个标签有多个选项(比如所在地区:北京,上海。。)。要满足这么多选项,我每个标签得用十六进制的两个 F,这样用户标签就变成了:0x301F0220。同样假如商品标签是 0x301F0000,这里商品只有两个标签有值,另外两个标签是空的。正常情况下,这个商品是可以推送给这个用户的。但是按照您说的做了与运算,这个是不是就不符合推送条件了?
    newtype0092
        11
    newtype0092  
       2019-10-31 00:23:09 +08:00   ❤️ 1
    @lovepim 标签不是之应该存在有和没有两个状态么?所以才能用 bit 位的 0 和 1 表示。比如说“年轻人”、“大学生”、“高消费人群”这种的。
    有多个选项这种应该是属性吧?如果你说的年龄、性别、职业这些就是具体的值,那就应该是 user 表的一个字段,大部分 app 设计用户表都会有这些属性
    lovepim
        12
    lovepim  
    OP
       2019-10-31 01:18:20 +08:00
    @newtype0092 你说的对,可能我表达不准确,我做的就是用户属性。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1138 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:22 · PVG 02:22 · LAX 11:22 · JFK 14:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.