0

我将表命名为message_tbldynamodb用于消息传递系统。

为了获取与特定conversation_id相关的所有消息项,我设计了这样的表:

属性是:

主哈希键=>conversation_id

主排序键=>date_time

其他属性=> sender_id,message

conversation_id date_time sender_id message 123456 2016-12-27 06:00:39 pm 10 hai how are you..? 123456 2016-12-27 06:01:00 pm 11 I am fine 123456 2016-12-27 06:01:12 pm 10 ok 123456 2016-12-27 06:01:12 pm 14 Hai man. How are you.?

由 => 10 和 14 同时发送的最后两个条目sender_id可能有机会发生。?如果发生这种情况,将用相同的主键替换属性值,并且会发生数据丢失。我应该使用一个唯一的随机 6 位字符串作为辅助本地索引吗?我可以从中逃脱..?

如果我将二级索引设置为排序键(唯一随机字符串) ,则将项目放入具有相同会话 ID 和日期时间的数据库可以接受。?如果我做错了,请让我设计桌子。

注意:我使用的是 PHP Codeigniter MVC 框架。

4

2 回答 2

1

是的,使用 DynamoDB,如果你Hash Key是你的conversation_id,你Sort Key是的date_time,并且你收到这两条消息:

conversation_id date_time sender_id message 123456 2016-12-27 06:01:12 pm 10 ok 123456 2016-12-27 06:01:12 pm 14 Hai man. How are you.?

最后一条消息将覆盖它。

你能做的就是拥有一个message_id. 它本质上是您已经认为的唯一随机字符串Sort Key。所以这不会被覆盖:

conversation_id message_id date_time sender_id message 123456 1123 2016-12-27 06:01:12 pm 10 ok 123456 3213 2016-12-27 06:01:12 pm 14 Hai man

然后,如果您想查询conversation_id和排序date_time,就像以前一样,您可以创建一个本地二级索引

于 2017-01-06T20:34:47.780 回答
0

你的问题的答案是否定的。二级索引键不能确保二级索引定义的键的唯一性。

DynamoDB 上的二级索引旨在充当备用搜索路径,而不是备用唯一键。您可以将它们视为 RDBMS 世界中的非唯一索引。他们只是通过提供数据的替代组织来帮助搜索。

在此处引用本地二级索引的文档https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LSI.html

在 DynamoDB 表中,每个项目的组合分区键值和排序键值必须是唯一的。但是,在本地二级索引中,排序键值对于给定的分区键值不需要是唯一的。如果本地二级索引中有多个项目具有相同的排序键值,则查询操作会返回所有具有相同分区键值的项目。

同样对于这里的全球二级索引https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html

在 DynamoDB 表中,每个键值都必须是唯一的。但是,全局二级索引中的键值不需要是唯一的。

于 2020-01-03T14:27:52.513 回答