【问题标题】:Query Many to Many in Datastore with Filter使用过滤器在 Datastore 中查询多对多
【发布时间】:2014-01-09 10:04:01
【问题描述】:

我需要 2 个实体模型

class User(ndb.Model):
    username = ndb.StringProperty()
    # other properties

class Item(ndb.Model):
    type = ndb.StringProperty()
    # other properties

UserItem 之间存在多对多关系

class UserItem(ndb.Model):
    user = ndb.KeyProperty(kind=User)
    item = ndb.KeyProperty(kind=Item)
    # other properties

如何使用过滤器查询UserItem Item.type。类似于select * from UserItem where UserItem.user = user_key and UserItem.item.type = item_type

我知道我可以用 StructuredProperty 做到这一点,但实体限制为 1mb。如果模型无法实现,我应该如何对关系进行建模以在数据存储中使用过滤器工作来获取查询?

谢谢

【问题讨论】:

    标签: python database google-app-engine many-to-many google-cloud-datastore


    【解决方案1】:

    不能这样做,你不应该尝试。数据存储不是关系数据库,不应作为一个数据库使用。

    您应该考虑将键列表存储在其中一个实体中,而不是链接 UserItem 表。例如,您可以向用户添加一个字段:

    items = ndb.KeyProperty(kind=Item, repeated=True)
    

    然后使用您的用户对象,按键获取项目并过滤掉您需要的项目:

    user_items = ndb.get_multi(my_user.items)
    relevant_items = [item for item in user_items if item.type == my_type]
    

    确切的结构将取决于您的用例,但重点是不要像在 SQL 中那样考虑传统关系。

    【讨论】:

    • 感谢您的回答。那么过滤发生在数据存储之外?它有效率吗?假设我们有一个用户的#items > 1000。我可以用祖先键(父)建模吗
    • 当然,甚至是从 Item 到 User 的 KeyProperty,但无论哪种方式,它都不再是多对多的关系。
    • user_items = ndb.get_multi(my_user.items) relevant_items = [item for item in user_items if item.type == my_type] 像这样使用#items > 1000。性能如何?我可以用这种方式对列表进行排序吗?
    猜你喜欢
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2011-06-10
    • 1970-01-01
    • 2018-11-27
    相关资源
    最近更新 更多