求教数据库设计思路 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wufeng
V2EX    问与答

求教数据库设计思路

  •  
  •   wufeng 2022-07-24 11:10:22 +08:00 2890 次点击
    这是一个创建于 1251 天前的主题,其中的信息可能已经有所发展或是发生改变。

    MYSQL 几十万条产品数据(还会增加) 几千个用户(也会增加)

    一个产品被一个客户获取后 就不能被其他客户获取

    现在某一个用户 想去得到一个其他用户都没用过的产品

    在大并发的情况下

    怎么设计效率最高?

    我现在想法是建一个 黑名单的表 black 然后里面产品 id 和用户 ID select * from 产品 where id not in(select 产品 from black where 用户 ID=用户 ID)

    但是感觉这样一旦数据庞大后而且大并发下 效率会非常低

    第 1 条附言    2022-07-24 12:21:49 +08:00
    没表达清楚

    产品 使用情况

    产品 1 (用户 1 ,用户 3 ,用户 4 ,用户 5 )
    产品 2 (用户 2 ,用户 4 ,用户 5 )
    产品 3 (用户 1 ,用户 2 )
    产品 4 (用户 2 ,用户 3 )
    产品 5 (用户 3 )
    产品 6 (用户 4 )
    产品 7 (用户 2 ,用户 5 )
    产品 8 (用户 6 )

    想要
    随机取出一个 用户 1 没有用过的产品
    19 条回复    2022-07-25 13:54:41 +08:00
    acapla
        1
    acapla  
       2022-07-24 11:46:30 +08:00
    12306 火车票的实现?
    qiayue
        2
    qiayue  
    PRO
       2022-07-24 12:11:52 +08:00
    产品表增加一列存储客户 ID ,0 表示没有被用过
    neptuno
        3
    neptuno  
       2022-07-24 12:16:45 +08:00 via iPhone
    获取是指下单吗?量级不大的时候 redis 锁就能满足了吧
    wufeng
        4
    wufeng  
    OP
       2022-07-24 12:23:22 +08:00
    @qiayue 那就是一个产品只能被用户使用一次了
    wufeng
        5
    wufeng  
    OP
       2022-07-24 12:37:55 +08:00
    我还有个思路就是 生成一个表 然后去 select
    产品 1 用户 1 使用情况
    产品 1 用户 2 使用情况
    产品 1 用户 3 使用情况
    产品 2 用户 1 使用情况
    产品 2 用户 2 使用情况
    产品 2 用户 3 使用情况
    -----
    但是每增加一个用户就要增加几十万条
    似乎是很笨的方法
    lidlesseye11
        6
    lidlesseye11  
       2022-07-24 13:20:42 +08:00
    一个产品被一个客户获取后 就不能被其他客户获取
    产品 1 (用户 1 ,用户 3 ,用户 4 ,用户 5 )
    这不矛盾吗?
    xenme
        7
    xenme  
       2022-07-24 13:25:23 +08:00 via iPhone
    @wufeng 5 楼的方法不挺好么,使用了才有记录,新用户用多少个产品才增加多少记录,还好吧
    BingoXuan
        8
    BingoXuan  
       2022-07-24 13:30:13 +08:00
    布隆过滤器,每个用户单独一个布隆过滤器,随机取出产品,检查是否曾经被使用过。
    dr1q65MfKFKHnJr6
        9
    dr1q65MfKFKHnJr6  
       2022-07-24 13:46:44 +08:00   3
    看了 1 分钟, 硬是没看懂题目。。
    dr1q65MfKFKHnJr6
        10
    dr1q65MfKFKHnJr6  
       2022-07-24 13:48:53 +08:00
    针对用户自定义索引,毕竟用户才几千
    28Sv0ngQfIE7Yloe
        11
    28Sv0ngQfIE7Yloe  
       2022-07-24 13:53:39 +08:00
    >> 一个产品被一个客户获取后 就不能被其他客户获取

    >> 产品 1 (用户 1 ,用户 3 ,用户 4 ,用户 5 )

    ????
    wufeng
        12
    wufeng  
    OP
       2022-07-24 13:55:13 +08:00
    @lidlesseye11 第一次说错了 看补充
    wufeng
        13
    wufeng  
    OP
       2022-07-24 14:16:40 +08:00
    @xenme 要全部存储 因为最后 select 的是没用的 而不是已经使用的
    所以每个用户和每个产品关系都存一遍 变成一个表
    感觉太庞大了
    wufeng
        14
    wufeng  
    OP
       2022-07-24 14:19:49 +08:00
    @Morii 看补充 小白技术比较差
    itechify
        15
    itechify  
    PRO
       2022-07-24 14:37:25 +08:00 via Android
    是不是想问:产品可以被用户使用,用户 A 在搜索产品时,搜索不被 A 使用过的产品?
    wufeng
        16
    wufeng  
    OP
       2022-07-24 14:48:06 +08:00
    @oneisall8955 是的 就是这个意思
    makdon
        17
    makdon  
       2022-07-24 15:19:48 +08:00
    用 redis ,搞个布隆过滤器,每次用户 A 用完之后就在 product:used:idA 里面 bfAdd 一下这个产品 id
    每次搜索结果出来之后,过一下布隆,再返回布隆里面不存在的
    前提是用户用过的产品集合在所有产品集合里面占比较低
    reter
        18
    reter  
       2022-07-24 16:16:36 +08:00
    这种如何:

    先拿到用户已使用的产品列表(数据规模较小 ):

    select * from 产品 as a
    where exist (select 1 from 产品使用情况 as b where b.用户 ID = 目标用户 ID and a.产品 id = b.产品 id and status=已使用)

    其中,产品使用情况表只存储用户有使用过的产品,没有使用过的不要存储。如果用户曾经使用过某个产品,但后来又不使用了,可以更新状态,或者删除记录。

    然后在查询的时候排除掉已使用的产品:

    select * from 产品
    where 产品 NOT IN (用户已使用的产品列表)
    mitsuizzz
        19
    mitsuizzz  
       2022-07-25 13:54:41 +08:00
    先 left join
    然后 is null
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5202 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 41ms UTC 03:39 PVG 11:39 LAX 19:39 JFK 22:39
    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