繁体   English   中英

AWS Amplify 和 DynamoDB 中 Posts 和 PostReactions 的最佳方法

[英]Best approach for Posts and PostReactions in AWS Amplify and DynamoDB

我正在使用 AWS Amplify 开发聊天功能,我的 graphql 架构中有一个简单的 Post model:

type Post
...
{
    id: ID!
    channelId: ID @index(
        name: "byChannel", sortKeyFields: ["createdAt"],
        queryField: "listPostsByChannel"
    )
    customerId: ID @index(
        name: "byCustomer", sortKeyFields: ["postType", "createdAt"]
    )
    text: String!
    postTempId: String
    postType: String
    reactions: [PostReaction] @hasMany(fields: ["id"])
    createdAt: AWSDateTime
    updatedAt: AWSDateTime
}

我想要实现的是与其他流行的聊天应用程序类似 - 每个帖子都附有表情符号的反应,所以我创建了另一个表和 PostReaction model。

type PostReaction
...
{
    postId: ID! @primaryKey(sortKeyFields: ["customerId", "emojiUnicode"])
    customerId: String!
    customerMeta: CustomerMeta
    emojiUnicode: String!
    createdAt: AWSDateTime
    updatedAt: AWSDateTime
}

当然,每个客户可以在一个帖子中添加多个表情符号,自定义主键用于稍后处理重复。

这里有一个缺点。 表情符号将列在帖子的reactions字段中的数组中,即使它是许多人添加的相同表情符号也是如此。

而不是前端需要为每个帖子合并的简单反应数组,最好的方法是从每个Post的 AppSync 查询中获取结果,例如:

...
reactions: [{
  emojiUnicode: "U+1F44D",
  customerIds: ["ID1234", "ID5678"],
  ...
}, {...}]

我以为我可以在reactions字段中使用 JSON object,但 DynamoDB 对单个项目的最大大小限制为 400KB。 这暂时不是问题,但是当我给model这个帖子增加更多的属性,当很多人同时有很多反应的时候,这可能是一个问题。

有没有选择如何以最简单的方式实现这一目标?

不要让你的架构过于复杂的最好办法是强制使用最大数量的表情符号,就像 Slack 所做的那样:例如:

您最多可以为任何消息添加 23 个表情符号反应,但每条消息最多可以添加 50 个独特的表情符号。

除此之外,你可以为每个反应的表情符号保留一个项目

pk 斯克 数据
线程123 元数据 关于线程的元数据
线程123 帖子#001 线程中的第一条消息
线程123 帖子#002 线程中的第二条消息
线程123 帖子#003 线程中的第三条消息
线程123 帖子#003#emoji#U+1F44D [用户 1、用户 2、用户 45]
线程123 帖子#003#emoji#U+1F33R [用户 56、用户 8、用户 7、用户 10]

现在,当您希望所有数据填充 UI 上的给定线程时,您只需使用 pk 作为参数发出查询:

SELECT * FROM table WHERE PK = 'thread123'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM