NDB:按多个实体的属性进行过滤

时间:2014-11-28 14:59:42

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

我来自SQL背景,我想知道如何在NDB中过滤相当于SQL中的许多连接,以及如何使这些查询扩展。举个例子:

class PromDate(ndb.Model):
  user_id = ndb.StringProperty(required=True) # user id
  age = ndb.IntegerProperty()

class DesignerBrand(ndb.Model):
  name = ndb.StringProperty()

class Socks(ndb.Model):
  owner = ndb.KeyProperty(kind=PromDate, required=True) # reference to PromDate
  designer = ndb.KeyProperty(kind=DesignerBrand, required=True) # reference to DesignerBrand
  color = ndb.StringProperty()
  do_they_smell = ndb.BooleanProperty()

class Tie(ndb.Model):
  owner = ndb.KeyProperty(kind=PromDate, required=True) # reference to PromDate
  designer = ndb.KeyProperty(kind=DesignerBrand, required=True) # reference to DesignerBrand
  color = ndb.StringProperty()

如果我们想找到一个超过21的PromDate拥有蓝色Calvin Klein或Target袜子,它们没有气味和红色领带,我们如何在不使用StructuredProperties的情况下做到最好?示例查询会非常有帮助的。

使用与上述键之间的关联以及将Socks / Tie作为PromDate的重复StructuredProperty之间的权衡是什么?具体来说,如果我们在PromDate中添加大量其他服装(例如,数十万件),我担心尺寸限制(1MB,根据文档)。

基本上,我们应该如何在NDB中考虑这样的复杂查询?我们如何保持快速和简单 - 最重要的是,可以在大量数据中进行扩展?

2 个答案:

答案 0 :(得分:1)

不幸的是,我相信您需要多次查询来减少所需的PromDate个实例列表。

你的NoSQL:你越谨慎地规范你的架构,事情就越糟糕,因为,你看,没有连接!

去标准化(有时使用结构化属性,更简单地在其他时间 - 例如,只需使用设计器名称代替设计器密钥,以便您可以直接查询它)将有所帮助,但是,它是'仍然是一个与关系数据库完全不同的世界(这就是为什么仍然提供关系数据库的原因,例如Google Cloud SQL,作为替代方案)。

答案 1 :(得分:1)

您可以对数据进行非规范化并形成结构化属性,然后在其上运行多个过滤器。

来自他们的样本:

class Address(ndb.Model):
    type = ndb.StringProperty()  # E.g., 'home', 'work'
    street = ndb.StringProperty()
    city = ndb.StringProperty()

class Contact(ndb.Model):
    name = ndb.StringProperty()
    addresses = ndb.StructuredProperty(Address, repeated=True)

def query_contact_multiple_values_in_single_sub_entity():
    query = Contact.query(Contact.addresses == Address(city='San Francisco',
                                                       street='Spear St'))
    return query