【问题标题】:Is AWS DynamoDB fit for data collecting and analysis app?AWS DynamoDB 是否适合数据收集和分析应用程序?
【发布时间】:2020-01-31 06:19:29
【问题描述】:

我正在构建一个简单的比方说调查应用程序。我有以下要求:

User: 
- name 
- surname 
- age

Question: 
- question (text) 
- type 
- author

Answer: 
- value 
- date  

我希望用户对答案提出问题,并且我希望能够查询以下内容:

  • 获取用户的问题和答案
  • 获取问题及其答案
  • 按(或在哪里)类型获取用户的问题和答案
  • 按价值(或价值所在)获取问题的答案
  • 统计问题的答案
  • 按用户年龄获取问题的答案
  • 随着时间的推移获取问题的答案(按用户或一般)

到目前为止,我想出了以下解决方案:

所以这里的分区键是 ID,排序键是类型

所以第一个问题是第一个要求:

  • 获取用户的问题和答案

我应该添加另一个类型,即user 吗?

现在如何:

  • 得到一个问题及其答案?

我可以查询id = 1 and type starts with question,但我会得到很多不必要的user记录。

现在下一个:

  • 获取用户对特定类型问题的回答(类型作为问题属性)

  • 如何计算一个问题的相同答案?

我是 DynamoDB 的新手,非常感谢任何帮助!

【问题讨论】:

    标签: database amazon-web-services database-design amazon-dynamodb data-modeling


    【解决方案1】:

    我会为每个表添加一个 id(从代码生成的 uuid)。

    获取用户的问题和答案

    将 userId 设置为 Question 和 Answer 中的字段,然后在其上设置索引。这将允许您(通过 2 个单独的查询)获取特定用户的所有问题和答案。

    得到一个问题及其答案?

    答案将作为字段 questionId 并且适用相同的索引原则

    获取用户对特定类型问题的回答(类型为问题属性)

    您可以向 Answer 添加一个字段,即 questionType 并对其进行过滤。请记住,NoSQL 架构专注于您需要的查询,而不是完美的规范化架构。

    如何计算一个问题的相同答案?

    我猜你的意思是一个问题有多少个答案。好吧,如果您知道 questionId,只需按照“获取问题及其答案?”并在查询上执行.withSelect(Select.COUNT)

    编辑

    User: 
    - userId (hash key)
    - name 
    - surname 
    - age
    
    Question: 
    - questionId (hash key)
    - question (text) 
    - type 
    - author
    - askedByUserId (index - hash key)
    
    Answer: 
    - answerId (hash key)
    - value 
    - date 
    - answeredByUserId (index - hash key)
    - questionId (index - hash key)
    

    所以一切都取决于您查询数据的方式(当然,您甚至可能最终切换到 SQL,noSQL 不是 1:1 的替代品)。仅通过 id 引用并没有错,我宁愿拥有不可变的问题和答案,而不是每次收到答案时都编辑问题。所以请考虑到您不能使用连接,并且总是更喜欢不可变数据(添加新值而不是编辑)。

    编辑 2

    为了从用户那里获得所有问题和答案,请创建和管理此表:

    UserItems:
    - userId (hash key)
    - question (full json of a question, optional)
    - answer (full json of a answer, optional)
    

    因此,例如,每次创建新问题时,请将其添加到 Question 和 UserItems 中。根据散列键做一个简单的查询,你会得到所有的问题和答案,以及完整的数据。同样,这是基于您的查询需求。

    【讨论】:

    • 嗯...难道不是将“关系”与记录中的其他记录放在一起,比如问题和答案中的 userId 会使数据库模型“关系”,这在 NoSQL 模型中应该避免?到目前为止,我已经观看了 2 个关于 DynamoDB 的 AWS 视频,但还没有看到这个解决方案。我可以将 questionId、answerId、userId 添加到其他记录中,对我来说这似乎是一个关系模型。也许你可以用表格来想象你的答案?我可能错过了重点
    • 您能否解释一下您将如何查询例如特定用户的所有问题和答案?您可以在一个查询中完成它而无需往返服务器吗?如果您可以编写一个示例查询,那就太好了。
    • 就我个人而言,我会做 2 次查询,分别是 Question 中的索引 askByUserId 和 Answer 中的索引 answersByUserId。它们是不同的实体,所以没有错。有没有办法只用1个查询?可能,但它需要改变模式,我对我的感觉很舒服。如果您关心响应时间,请执行两个异步调用。我将添加和编辑关于如何使用一个查询来完成这两个问题的答案。
    • 嘿,感谢您的意见,我自己回答了这个问题。很高兴听到你的想法。
    【解决方案2】:

    好的,所以我花了好几个小时才找到答案。

    让我们从实体及其关系开始,这是图表:

    地点:

    • USR - 用户
    • ANS - 回答
    • QUE - 问题

    如上所示,我没有任何多对多关系,因此我将用于检索数据的唯一模式是主键(分区键 + 选择键)模式。

    如果我在模型中有多对多关系,除了 PK+SK 我还会使用 GSI(全球二级索引) GSI 还可用于创建不同的视图,例如通过交换 PK 与 SK 的位置。

    现在是数据库访问模式:

    不幸的是,上面并没有涵盖所有的访问模式,我能想到的还有几个:

    • 按用户年龄查询答案
    • 查询问题的答案并按类型计算答案的百分比(是否应该在 DynamoDB 之外计算?)

    现在是数据库表设计:

    因此,基于访问模式表中的访问模式,我可以使用这种设计进行查询:

    1. 用户对问题的所有回答
      • SELECT PK=USR_1 WHERE SK starts_with(AR_QUE_2)
    2. 用户对所有问题的所有答案
      • SELECT PK=USR_1 WHERE SK starts_with(AR_QUE) - 在这种情况下,我必须在 AR_QUE_X_ANS_Y 的属性中包含问题元数据(问题本身作为文本),这样我就不必查询多次表以获取所有问题元数据。
    3. 一个问题的所有答案
      • 选择 PK=QUE_2

    我真的很想听听有人对此的看法。 我也很感激在某些情况下我必须对数据进行非规范化并在 Attributes 中插入元数据信息。

    我仍然很好奇如何按类型计算问题的答案数量,并计算例如不同类型答案的百分比。

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 2014-09-24
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 2015-12-26
      • 1970-01-01
      • 2017-03-24
      相关资源
      最近更新 更多