你能帮我理解一下nbd Key Class Documentation或祖先的关系吗?

时间:2017-08-15 09:11:08

标签: python google-app-engine google-cloud-datastore app-engine-ndb

我正试图将我的脑袋包裹起来,但是我并不完全理解documentation for the Key Class /或者它可能是一般的祖先关系,我无法理解。 我认为我想要的是多个祖先。

实施例: 说我想模仿我们学校的慈善年度赞助计划;学校的孩子们在赛道周围跑来跑去,他们的亲戚(=赞助商)每完成一轮就捐给慈善机构。

在我看来,我会创建以下类型:

  1. 个人资料(可以是跑步者和赞助商)
  2. 运行(定义谁(参见个人资料)运行什么慈善机构,轮次实际完成)
  3. 赞助(定义谁(参见个人资料)捐赠多少运行,捐赠是否已经进行)
  4. 我已经了解到数据存储区是一个nosql非关系型数据库,但还没有完全掌握它。所以我的问题是:

    一个。创建“赞助”实体甚至是数据存储中的最佳方式?我也可以将它建模为一种关系(每次运行都有赞助商) - 但是因为我也想跟踪赞助金额,赞助商是否付款以及可能更多这似乎不合适

    湾我想轻松查询由一个人制作的所有赞助商以及属于特定运行的所有赞助商。 所以,我觉得,这是合适的:

    Profile --is ancestor of--> Run
    Profile --is ancestor of--> Sponsorship
    Run --is ancestor of--> Sponsorship
    

    这是明智的吗? 我可以看到一个constructor代表一个Key,它在祖先的顺序中作为参数有几种。这是为这个案子设计的吗? “运行”和“配置文件”将处于相同的“级别”(即妈妈和爸爸的祖先不是父亲和祖父) - 这个构造函数在python中会是什么样子?

1 个答案:

答案 0 :(得分:2)

在实体之间建立关系的主要方式是通过实体模型中的关键属性。通常不需要祖先。

例如:

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

class Run(ndb.Model):
    runner = ndb.KeyProperty(kind='Profile')
    rounds = ndb.IntegerProperty()
    sponsorship = ndb.KeyProperty(kind='Sponsorship')

class Sponsorship(ndb.Model):
    run = ndb.KeyProperty(kind='Run')
    donor = ndb.KeyProperty(kind='Profile')
    done = ndb.BooleanProperty()

祖先只是将实体放在同一个实体组中(这可能是非常有限的!),同时在模型已经建立的关系之上强制执行其他关系。请参阅Transactions and entity groups,也许Contention problems in Google App Engine