【问题标题】:Data storage: "grouping" entities by property value? (like a dictionary/map?)数据存储:按属性值“分组”实体? (像字典/地图?)
【发布时间】:2012-02-19 13:06:11
【问题描述】:

使用 AppEngine 数据存储,但这可能是不可知的,不知道。

假设有一个名为Comment 的数据库实体。每个Comment 都属于一个User。每个Comment 都有一个date 属性,到目前为止非常标准。

我想要一些可以让我使用的东西:指定一个 User 并取回一个字典式(来自 Python 背景,请原谅。哈希表、映射,但是应该在这种情况下调用它)数据结构,其中:

  • keys:每个date 出现在User 的评论中
  • 值:在date 上创建的Comments

我想我可以迭代一系列日期并自己构建这样的地图,但我严重怀疑我需要在这里“发明”自己的解决方案。

有没有办法/工具/技术来做到这一点?

【问题讨论】:

    标签: database google-app-engine google-cloud-datastore


    【解决方案1】:

    Datastore 支持引用和列表属性。这让您可以通过两种方式建立一对多关系:

    1. 父(用户)有一个列表属性,其中包含子实体(注释)的键。

    2. Child 有一个指向 Parent 的键属性。

    由于您需要按日期限制评论,因此您最好选择选项二。然后您可以查询具有 date=somedate(或日期范围)和 where user=someuserkey 的 Comments。

    Datastore 中没有本机分组功能,因此要按日期“分组”,您可以在查询中添加按日期排序。与迭代结果相比,当日期更改时,您可以使用/存储它作为分组键。

    更新

    设计 no-sql 数据库应该面向访问(相对于 sql 中面向数据模型):对于经常使用的操作,您应该尽可能便宜地获取数据(= 尽可能少的操作)。

    因此,根据经验,您应该在一次操作中只获取当时需要的数据(= 在该页面上显示给用户)。我不确定您的应用程序的设计,但我怀疑您是否需要一次所有用户的完整 cmets(包括文本和所有内容)。

    【讨论】:

    • 实际上,执行 #2 隐式执行 #1:它在父实体中创建一个 _set 属性,所以这并不是两种不同的方法,是吗?无论如何,那么,愚蠢的迭代并注意 dateit 的变化是什么?我实际上希望有一些 MapReduce 式的东西。或者指数化。那好吧。但我会继续寻找。我想要更好的东西。
    • 不,肯定不是在 Java 中。我没有使用 Python,但很确定它没有。 1. 和 2. 在不同的方向上引用:1. parent 指向 children,2. child 指向 parent。
    • Map reduce 只是一种处理大量数据的技术,通过拆分(映射)并执行一些产生某些结果的操作(减少)。它主要用于报告/OLAP 和没有经典查询的 NoSQL 系统。
    • 关于“indexish”:如果您查询多个属性(日期、用户),则无论如何都需要索引。
    • 啊,对,也许 Java 不这样做。 Python 可以。感谢您提供额外的意见,我将在一两天后回到这个问题上,目前转到另一个项目。
    【解决方案2】:

    我首先要说的是,你不应该为拥有 Python 背景而道歉。 App Engine 开始仅支持 Python。使用 db 模块,您可以将 User 实体作为多个 DailyCommentBatch 实体的父实体,每个实体都是几个 Comment 实体的父实体。 IIRC,这将使所有相关实体存储在一起(或关闭)。

    如果您使用的是 NDB(我喜欢它),您可能在 User 或 DailyCommentBatch 级别使用了 StructuredProperty。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 2010-12-06
      相关资源
      最近更新 更多