1

我是数据存储的新手。将其用于非GAE应用程序。数据存储最好的方法来存储汇总的嵌套数据,以便更好地查询

我正在接近为我的使用案例更好的设计。

通过平铺和存储在多种类型中存储嵌套聚合数据以获得更好的查询支持。

"DateTime": "2015-10-21 12:10:50", 
"Domain": "abc.com", 
"Events": [ 
    { 
     "EventName": "visit", 
     "EventCount": "188", 
     "Attributes_Aggregations": [ 
      { 
       "Name": "color", 
       "Value_Aggregations": [ 
        { 
         "Value": "red", 
         "Count": "188", 
         "Unique_Users": [ 
          { 
           "ID": "user1", 
           "Count": "38" 
          }, 
         ] 
        }, 
       ] 
      }, 
     ] 
    }, 
] 

我将它存储为5种。每种都与另一种作为祖先的关键。

类:域名

domain_name - abc.com 

类:事件

evt_name - visit 
evt_count - 188 
evt_datetime - 2015-10-21 12:10:50 
ancestor_key - Domain abc.com 

类:属性

att_name - color 
evt_datetime - 2015-10-21 12:10:50 
ancestor_key - Domain abc.com Event visit 

类:的AttributeValue

att_value - red 
att_value_count - 108 
evt_datetime - 2015-10-21 12:10:50 
ancestor_key - Domain abc.com Event visit Attribute color 

类:用户

user_id - user1 
count - 38 
evt_datetime - 2015-10-21 12:10:50 
ancestor_key - Domain abc.com Event visit Attribute color AttributeValue red 

我已经在各种添加 'evt_datetime' 属性,因为这将是主过滤器键。

我已经设置了所有属性的索引来启用任何属性过滤器,但是由于一个属性限制上的一个不等式过滤器导致我暂停。

正如您所看到的,我无法使用(>,<,> =,< =)过滤evt_datetime和evt_count。

是否有更好的方法来设计这些模式使用多个过滤器或无差别的查询?

+0

这对于堆栈有点宽泛......在任何情况下,通常当人们试图做多重不平等时,我们建议一个可以使用的计算属性。例如,假设您总是希望计数超过200的事件,您可以添加“over_200”布尔参数,然后在该参数上使用=。一般来说,如果你需要两个不等式,最好的建议是用一个查询,然后用代码来过滤另一个 – Patrice

回答

1

答案可能是将所有内容都存储在单个实体中。 对StructuredProperties使用重复属性(或者如果您想要具有复杂结构,则使用LocalStructuredProperties)。

你不必查询你正在寻找的确切实体。使用单个查询执行查询并通过代码过滤结果。

这种可能性真的取决于你如何存储这个以及你计划添加多少重复的项目(因为实体大小不能超过1MB的存储空间)。