我来自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中考虑这样的复杂查询?我们如何保持快速和简单 - 最重要的是,可以在大量数据中进行扩展?
答案 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