google-app-engine - 键的列表属性与 App Engine 中的多对多

标签 google-app-engine models

作为一个假设的例子,我有一个模型 TodoItem 和一个模型 TodoList。 TodoList 有一个有序的 TodoItem 列表,任何一个 TodoItem 都可以属于任意数量的 TodoList(多对多)。除了 TodoList 中 TodoItem 的顺序之外,不需要存储关于它们之间关系的其他信息。在数据存储中表示这一点的最佳方式是什么?

有两种方法可以实现这个——给 TodoList 类一个 db.Key 的 ListProperty,它将引用 TodoItem 的:

class TodoList(db.Model):
  items = db.ListProperty(db.Key)

或者创建一个包含排序信息的 ListItem 模型:

class TodoListItem(db.Model):
  item = db.ReferenceProperty(TodoItem)
  list = db.ReferenceProperty(TodoList)
  order = db.IntegerProperty()

稍后我肯定会通过对模型进行反规范化来优化它,但是在优化前,任何一种表示都比另一种有优势吗?

最佳答案

这取决于几个因素:

  • 您是否需要存储有关关系本身的信息,而不是它的顺序?例如,订单和产品之间的多对多需要存储每个产品的数量。
  • 您是否需要将关系一侧的超过一千个左右的项目与“较小”基数相关联(例如,>1000 个待办事项,或一个项目的>1000 个列表)?
  • 您通常是希望一次检索所有相关项目,还是希望更有选择性?

如果您需要额外的信息,或者关联中有很多元素,或者只需要检索其中的几个元素,关系实体可能是更好的选择。在其他情况下,列表可以更容易和更快。对于待办事项列表,我会说键列表绝对是最好的方法。

关于google-app-engine - 键的列表属性与 App Engine 中的多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1376814/

相关文章:

Python Google Analytics OAuth 服务帐户和 2LO; "sub"参数和域范围委托(delegate)

java - 无法使用 Google App Engine (GAE) 连接到 Google Cloud Messaging (GCM) 服务器

java - 改造 : How to decide the class members?

python - django模型字段中字符串参数的含义是什么?

google-app-engine - Google 语音 API v1beta1(同步识别和异步识别 API 调用)

python - 如何更改 python 应用程序引擎中日志消息的默认格式?

php - Zend Framework 模型未由自动加载器加载

python - Django 表关系及其调用方式说明

django - 我应该以任何方式避免 Django 中的多表(具体)继承吗?

java - 从数据存储中检索实体的时间