Dynamodb 应该怎么复杂查询呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
john990
V2EX    Amazon Web Services

Dynamodb 应该怎么复杂查询呢?

  •  1
     
  •   john990 2021-04-04 22:55:46 +08:00 3503 次点击
    这是一个创建于 1717 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假如现在有一张歌曲表

    id title artist duration cover
    hash1 青花瓷 周杰伦,林俊杰 320000 http://a.bbb.com/a.jpg
    hash2 青花瓷 周杰伦 310000 http://a.bbb.com/b.jpg

    因为一首歌可能有多个版本,多个歌手演唱。

    那么这个表应该怎么设计才能最快捷的根据 歌手+歌名 查询到对应的数据呢?

    Dynamodb 的 getItem 和 query 必须要确定分区主键才能查询,可是我要查询后才能知道主键啊,直接懵了。

    客户端初次搞后端很多要学习啊。

    12 条回复    2021-04-05 10:58:13 +08:00
    RangerWolf
        1
    RangerWolf  
       2021-04-04 23:57:06 +08:00   1
    DynamoDB 很便宜,速度也很快,建议以歌名为主键写进去,根据不同的需求去不同的表查询

    话说,为什么用这个?直接 MySQL 、PSQL 扛不住么?
    john990
        2
    john990  
    OP
       2021-04-05 00:00:04 +08:00 via Android
    @RangerWolf lambda 只支持 dynamodb
    john990
        3
    john990  
    OP
       2021-04-05 00:01:10 +08:00 via Android
    @RangerWolf 歌曲同名的很多啊,重复的不能做主键吧
    binux
        4
    binux  
       2021-04-05 00:38:53 +08:00 via Android
    composite primary key
    Rocketer
        5
    Rocketer  
       2021-04-05 01:48:34 +08:00 via iPhone   4
    DynamoDB 是靠 GSI 实现复杂查询的。

    比如你的需求,可以建一个 Partition Key 为歌手,Sort Key 为歌名的 GSI (其实反过来也行,具体看你还有没有别的需求可以利用这个 GSI ),然后 query 这个 GSI 就行了。

    GSI 用起来跟表一模一样,只是表里的键是唯一的,而 GSI 允许重复。你用”歌手=xxx AND 歌名=xxx“为条件可能搜到多个 item,所以你只能 query 而不能 getItem,然后再根据搜到多少条来决定下一步怎么处理。

    另外,歌手如果是个检索条件,那就不应该放到同一个 item 里,而是为每个歌手创建一个 item 。这样你就可以通过 GSI 搜索”歌手=xxx”来得到该歌手所有的歌曲。
    john990
        6
    john990  
    OP
       2021-04-05 07:04:53 +08:00 via Android
    @Rocketer 谢谢!我去找下相关资料
    不过还有个问题,歌曲表的主键随机生成吗,因为歌手和歌名没有唯一确定值的字段
    Rocketer
        7
    Rocketer  
       2021-04-05 08:33:05 +08:00 via iPhone   3
    @john990 本来都写了 500 字了,又删了,因为不知道还要写多少。你这是个多对多的关系,是最复杂的场景,我怕是很难用几句话给你讲清楚。

    你还是读一下官方的最佳实践吧,根据官方推荐的做法,你应该把所有数据都放在一张表里,所以不会有歌手表这种东西。

    另外,用 DynamoDB 不能一点一点的挤牙膏,你得先把所有读取的场景都列出来再设计表,否则后期很难修改。所以最好以微服务的思想去设计你的系统,每个服务各自用一个表,以降低耦合,在充分利用 DynamoDB 优势的同时为后期扩展保留灵活性。
    buddie
        8
    buddie  
       2021-04-05 08:49:36 +08:00
    @Rocketer 说得太好了!
    phy25
        9
    phy25  
       2021-04-05 09:34:17 +08:00 via Android   1
    cassyfar
        10
    cassyfar  
       2021-04-05 09:58:53 +08:00
    @phy25 能 nosql 还是 nosql
    john990
        11
    john990  
    OP
       2021-04-05 10:56:36 +08:00
    @Rocketer 非常谢谢你的回复,我懂我该做什么了
    john990
        12
    john990  
    OP
       2021-04-05 10:58:13 +08:00
    @phy25 果然,是我没看到,谢谢提醒
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4249 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 10:08 PVG 18:08 LAX 02:08 JFK 05:08
    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