【问题标题】:Table storage design for querying with a value within a range用于查询某个范围内的值的表存储设计
【发布时间】:2017-10-28 06:38:34
【问题描述】:

我正在考虑使用表存储(如 Azure、Google 或 Apache HBase 类型)来存储实体/行,但我在网上找不到任何关于我的使用模式的帮助。它是这样的:

  • 实体具有 ID 或密钥,例如“UserId”
  • 日期值,例如“StartedUsingProduct”
  • 日期值,例如“StoppedUsingProduct”

查询的类型主要是“在日期 T,查找所有使用该产品的用户”。请注意,同一个 UserId 将有许多(数千)个开始/停止对。

在 Azure 案例中, - PartitionKey 是 UserID - RowKey“StartedUsingProduct” 但是如果不进行完整的分区扫描,我就找不到合适的查询方式。

在 Google 的案例中,按照他们的建议, - 键类似于“UserID_StartUsingProduct”, 当我必须检索大量行然后使用第二个属性过滤掉时,我会遇到同样的问题。

有人对如何攻击这种特定的使用模式有一些见解吗?

【问题讨论】:

  • 这是相当广泛的 - 没有一个单一的“正确的表格排列。我建议 1)你让这个更具体 - 显示你正在运行的查询,以及你遇到的问题和 2)分开你的问题. 现在,您标记了两个完全不同的云提供商/表存储服务。
  • 我不同意你的看法。 Azure 表存储和 Google 大表本质上是一回事,只是 Azure 将行键拆分为两部分略有不同,谷歌建议将两部分连接成一个键。它们都是 NoSql,键值存储,查询在直接点击一个键或一系列键时进行了优化。它们都可以有任意数量的列,并且这些列可以从一行更改为另一行。
  • 至于 1) 显示查询,它已经存在,以 粗体。这是目前唯一值得关注的问题。
  • 澄清一下:您是否仅在用户“开始”或“停止”使用该产品时获得更新?您是否没有收到用户仍在使用该产品的每日“ping”?因此,例如,如果用户在 1 月 1 日开始使用该产品,并在 12 月 31 日停止使用,但在 7 月 5 日,如果您提出问题,它应该能够找到 1 月 1 日的“开始”标记并且没有现有的停止标记,并因此得出结论该用户仍在使用该产品?

标签: azure azure-table-storage google-cloud-bigtable nosql


【解决方案1】:

假设一个非常简单的实体设计只考虑这三个自定义属性:

  1. 用户ID
  2. 动作 - 指示开始或停止
  3. 日期时间

因此,当用户开始使用产品时,您可以为该用户插入一个带有Action = startDateTime = current date/time 的实体。同样,当用户停止使用该产品时,您可以为该用户插入一个带有 Action = stopDateTime = current date/time 的实体。

您必须使用的模式是为单个活动存储多个记录

这是必需的,因为您可以查询日期(如您上面提到的)或查询用户,例如告诉我该用户开始/停止使用该产品的次数。

第一个实体将拥有PartitionKey = UserIdRowKey = Current Date/Time。您可以使用类似DateTimeValue.Ticks.ToString("d20") 的方式以转换为字符串的刻度形式存储当前日期/时间。此模式将确保您能够查询用户的活动。您将查询指定为PartitionKey eq UserId,您将获得该用户的所有记录。如果您有兴趣首先获取最新活动,您可以在 RowKey 中使用类似 (DateTime.MaxValue.Ticks - DateTimeValue.Ticks).ToString("d20") 的反向刻度。这将确保最新记录被添加而不是附加。

第二个实体将拥有PartitionKey = DateTimeValue.DateRowKey = UserId。如果您认为用户会在一天内多次开始/停止使用该软件,您可能希望在 RowKey 中附加日期时间值,并使用类似 RowKey = UserId|DateTimeValue 的内容。这将确保可以记录用户在一天内的多个开始/停止活动,而不会覆盖该用户当天的先前活动。现在您可以对 PartitionKey 进行查询,这将准确地告诉您所有用户开始/停止使用该产品的原因。

【讨论】:

    猜你喜欢
    • 2017-03-23
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多