【问题标题】:Dynamodb will consider the secondary index also a primary key, before put item into table.?在将项目放入表之前,Dynamodb 会考虑二级索引也是主键。?
【发布时间】:2016-12-29 08:03:57
【问题描述】:

我在 dynamodb 中有一个名为 message_tbl 的表,用于消息传递系统。

为了获取与特定 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.?

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

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

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

【问题讨论】:

    标签: insert amazon-dynamodb primary-key secondary-indexes


    【解决方案1】:

    是的,如果您的 Hash Keyconversation_id 并且您的 Sort Keydate_time 并且您收到这两条消息,则使用 DynamoDB:

    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 排序,就像以前一样,您可以创建一个Local Secondary Index

    【讨论】:

    • message_id 的值不应是随机值,而应该是该对话中每条消息的递增数字值。然后对其进行排序可以使它们按有意义的顺序排列。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多