【问题标题】:Many-To-Many Relationships in Google App Engine Datastore (ndb)Google App Engine Datastore (ndb) 中的多对多关系
【发布时间】:2012-11-26 12:48:49
【问题描述】:

我有两个模型:成员和事件。一个成员可以参加许多活动,而在一个活动中,有许多参与者。我是这样想的:

class Members(ndb.model):
    event = ndb.KeyProperty(repeated=True)

class Events(ndb.model):
    member = ndb.KeyProperty(repeated=True)

建立多对多关系的最佳方式是什么?

【问题讨论】:

    标签: google-app-engine app-engine-ndb


    【解决方案1】:

    我认为在这种情况下,您希望一个模型中的键数组/列表指向另一个模型。由于数组/列表的长度有限制(现在最大为 5000),您可能希望成员模型指向事件模型(我假设成员可能不会参加很多活动(超过5000),但有很多(超过 5000 名)成员参加活动)。现在,如果您想要与会者列表,您只需在成员模型中查询事件键即可。如果您只需要人数,您可以只进行键查询,这样可以节省成本。

    如果由于某种原因您需要使两个案例都超过 5000,那么您可以制作另一个(参与者)模型,其中包含一个成员密钥和一个活动密钥,然后为每个活动的每位客人制作此参与者模型。要获取客人列表,只需在此模型中查询特定事件,如果您需要成员的事件列表,则相反。这并没有比上述更多的工作,因此即使 5000 不是限制因素,您也可能会采用这种方式。

    【讨论】:

    • 如果任何给定活动的成员少于 5000 人,并且成员参加的活动少于 5000 人,您可以考虑更频繁地查询什么、给定成员的活动列表或与会者一个事件的列表。如果是第一个,则使用成员模型中的事件列表,如果是第二个,则可以考虑事件模型中的成员列表,尽管现在您的客人永远不会超过 5000 人。
    • 嗨,迈克尔,感谢您的出色回答。这在我搜索信息时得分很高,所以我希望你不介意问你一个问题。如果我选择attendee 模型选项,我是否必须获取每个成员实例的事件详细信息,反之亦然?我将在 Member 中的 def 中实现这一点,该定义将填充 Event 详细信息,并且可以根据我是否要延迟加载成员列表来调用或不调用。这是因为我无法在一个查询中获取所有数据,因为不支持连接(除非使用云 SQL)
    • “我是否必须获取每个成员实例的事件详细信息,反之亦然”如果我理解你,我认为答案是肯定的。如果您想知道成员将参加的活动的详细信息,您将首先查询参加者模型以获取成员正在参加的所有活动的列表。这将返回您的密钥(或您可以从中创建密钥的字段)。然后,您将获取(您无需查询)该列表中的所有事件。这种方法的缺点是获取信息需要额外的工作。
    • 谢谢你,迈克尔,我正在慢慢完成一个与学生一起玩的项目并完成课程。添加了一个 StudentCourse 类,该类具有 isInOther 和 getCourseForStudentKey 等方法,这似乎是一些额外的工作,但没关系。也许担心在完成全文搜索(课程和学生姓名)时会变得有点太贵。 Google 可能会向此类网站收取高昂的费用。
    • 注意限制应该小于 5000:stackoverflow.com/questions/15377119/…
    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    相关资源
    最近更新 更多