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

2019-10-29 13:21:55 +08:00
 lovepim

如题,遇到一个问题:

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

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

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

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/614027

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX