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

求教数据库设计思路

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

    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  
       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
    布隆过滤器,每个用户单独一个布隆过滤器,随机取出产品,检查是否曾经被使用过。
    cedoo22
        9
    cedoo22  
       2022-07-24 13:46:44 +08:00   ❤️ 3
    看了 1 分钟, 硬是没看懂题目。。
    cedoo22
        10
    cedoo22  
       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 看补充 小白技术比较差
    oneisall8955
        15
    oneisall8955  
       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   ·   实用小工具   ·   1863 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:25 · PVG 00:25 · LAX 08:25 · JFK 11:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.