我正在使用AWS Amplify开发聊天功能,并且在我的graphql模式中有一个简单的Post模型:
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模型。
type PostReaction
...
{
postId: ID! @primaryKey(sortKeyFields: ["customerId", "emojiUnicode"])
customerId: String!
customerMeta: CustomerMeta
emojiUnicode: String!
createdAt: AWSDateTime
updatedAt: AWSDateTime
}
当然,每个客户可以在一个帖子中添加多个表情符号,自定义主键是为了以后处理重复的。
这里有一个缺点。即使是许多人添加的相同表情符号,表情符号也会在帖子的reactions
字段中以数组形式列出。
而不是一个简单的反应数组,前端需要为每个帖子合并,最好是从AppSync查询每个Post
的结果,如:
...
reactions: [{
emojiUnicode: "U+1F44D",
customerIds: ["ID1234", "ID5678"],
...
}, {...}]
我认为我可以在reactions
字段中使用JSON对象,但是DynamoDB对单个项目的最大大小限制是400KB。现在这不是问题,但下次当我向Post模型添加更多属性时,当同时有许多人的许多反应时,这可能是一个问题。
是否有一个选项如何以最简单的方式实现这一点?
最好的办法是不要让你的模式过于复杂,就像Slack一样强制使用最大数量的表情符号,例如:
你可以为任何消息添加最多23个表情符号反应,但每条消息最多50个唯一的表情符号。
除此之外,你可以为每个表情符号保留一个项目