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

[求助] 用户查询商品时,应该怎么排除没有权限的商品?

  •  
  •   liubx · 2020-09-04 17:07:26 +08:00 · 2011 次点击
    这是一个创建于 1321 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 业务的逻辑是,为用户分配品牌。用户搜索商品,只能搜索出对应品牌的商品。

    • 我现在的做法是: 先查出用户有品牌权限的商品集合。然后查询时条件带上 in(goodsList)。

    • 这种做法,效率太低了。请问有什么好的思路吗?

    22 条回复    2020-09-05 09:40:12 +08:00
    zzw252
        1
    zzw252  
       2020-09-04 17:13:46 +08:00
    启用或登录时返回用户信息中带上权限集合,请求商品列表时回传权限集给后端?
    wj219
        2
    wj219  
       2020-09-04 17:35:14 +08:00
    商品里边有存品牌 id 么,条件用 in (用户有权限的品牌 id) 至少执行的 SQL 长度小一点
    nutting
        3
    nutting  
       2020-09-04 17:39:37 +08:00
    1L 馊主意,权限怎么能前端确定。这没啥思路,就是表关联,条件限制啊。你是说 in 这个做法 sql 低效?
    vone
        4
    vone  
       2020-09-04 17:40:54 +08:00
    拿把菜刀架在用户脖子上,然后说请不要点开没权限的商品。

    或者
    select *
    from 商品表
    join 商品品牌表 on m=n
    join 品牌权限表 on x=y
    locoz
        5
    locoz  
       2020-09-04 17:47:29 +08:00
    后端做效率太低辣,让前端在界面上直接隐藏没权限的商品(狗头保命)
    gaius
        6
    gaius  
       2020-09-04 17:50:05 +08:00 via Android
    搞个用户商品权限范围表,查询时实时获取,用 es 查,不知道有多少商品,想想还挺恐怖的
    A388
        7
    A388  
       2020-09-04 17:50:33 +08:00
    @nutting 可能是 nodejs 做中间层传的撒
    liubx
        8
    liubx  
    OP
       2020-09-04 17:51:21 +08:00
    @nutting 商品多的话,sql 就会很长,这样不影响效率吗?
    pushback
        9
    pushback  
       2020-09-04 17:52:08 +08:00
    create table (user) - (user_goods) - (goods)
    select g.*
    from
    user_goods ug
    left join goods g on ug.goods_id = g.id
    where
    ug.user_id = ?
    liubx
        10
    liubx  
    OP
       2020-09-04 17:54:15 +08:00
    @zzw252 权限是在后端获取的。跟前端没关系的
    liubx
        11
    liubx  
    OP
       2020-09-04 17:54:51 +08:00
    @pushback 嗯,用 join 的话,sql 会短些。
    liubx
        12
    liubx  
    OP
       2020-09-04 17:55:17 +08:00
    @locoz 这样前端会砍死我的
    liubx
        13
    liubx  
    OP
       2020-09-04 17:55:50 +08:00
    @gaius 还没有用上 es,现在就 sql 查了
    Orangutan
        14
    Orangutan  
       2020-09-04 17:57:57 +08:00
    楼主没有说清楚效率低具体是低在哪里? 瓶颈在哪里?
    如果是查询慢,同楼上,一般索引,sql 优化下,如果还是解决不了,可以将用户和相关品牌权限存入缓存. 直接从缓存拿到关系直接单表 in 查询,前提注意缓存更新维护
    liubx
        15
    liubx  
    OP
       2020-09-04 17:59:52 +08:00
    @Orangutan 现在效率还行。主要是担心,以后商品多了,sql 就会非常长,这样会不会导致 sql 查询慢
    redtea
        16
    redtea  
       2020-09-04 18:03:08 +08:00
    一个品牌一个库
    vencent00
        17
    vencent00  
       2020-09-04 18:04:52 +08:00
    用户组不是太多的话把用户组对应的商品 id 存 redis,查询慢的话就上 es 吧,除了价格都走 es 查。
    liubx
        18
    liubx  
    OP
       2020-09-04 18:09:49 +08:00
    @vencent00 嗯,之后会上 es 。现在害得用 mysql
    Orangutan
        19
    Orangutan  
       2020-09-04 18:10:53 +08:00
    @liubx 具体情况具体分析吧,有精力的话可以搞点测试数据模拟一下
    liubx
        20
    liubx  
    OP
       2020-09-04 18:14:57 +08:00
    @Orangutan 嗯,多谢。试试看
    yufeng0681
        21
    yufeng0681  
       2020-09-04 22:18:46 +08:00
    业务体验方面:搜索结果的前两页没有命中用户的诉求,后面一百页都没有人翻看。
    如果是淘宝类的商品
    用户会加筛选条件看前两页(比如筛选地区,筛选信用度,筛选销售量)

    前期没啥商品,性能够用,怎么搞都可以;后面肯定要上 ES 来做更复杂的搜索逻辑,性能就不需要考虑了。 除非你们钱多,请个 DBA 来优化 SQL
    xuanbg
        22
    xuanbg  
       2020-09-05 09:40:12 +08:00
    搞一个商品分组,权限和分组相关,然后联表查询吧。。。效能降低那是肯定的,但也没有更好的办法了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5389 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 08:38 · PVG 16:38 · LAX 01:38 · JFK 04:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.