【问题标题】:How to handle "reference data" (static data) in the Google App Engine datastore?如何处理 Google App Engine 数据存储区中的“参考数据”(静态数据)?
【发布时间】:2011-12-08 11:04:30
【问题描述】:

我正在开发一个应用程序,其中有一组数据,虽然在技术上不是静态的,但不会经常更改(例如,平均每年 3 或 4 次)。但是,其中一些数据是相互关联的。

此类数据的一个示例是州和县 - 理想情况下,我们希望在输入地址或位置时知道所有可用的州,但我们也想知道每个州的可用县,这样我们就可以向用户适当地显示该信息(即,当用户选择了一个州时,过滤掉不适当的县)。

过去,我在关系数据库中通过州和县表完成此操作,其中县链接回其所属的州,州和县链接到需要其信息的任何表.

然而,这些数据并不属于自己,而且在 Google 数据存储中,即使我们没有主动修改这些数据,锁定事务机制似乎也会导致锁定发生。处理此类数据的最佳方法是什么?是否为没有父级(无/空的父级)的片段提供一个实体?这会在将来导致锁定问题吗?

【问题讨论】:

  • 为什么你认为事务机制会导致锁?事务仅适用于实体组。您希望针对哪个实体进行交易写入?
  • @DaveW.Smith 我说的是我正在加载的实体——在这个例子中,特别是州和县。我不打算对它们进行写入,但我认为我读到如果读取多个实体组,在事务期间读取会导致锁定多个实体组 - 不过我可能会误会。
  • 我认为你错了。
  • @DaveW.Smith 啊,好吧,那更有意义。谢谢!
  • App Engine 的数据存储层是无锁的 - 它使用乐观并发,而不是锁定。

标签: google-app-engine google-cloud-datastore data-modeling


【解决方案1】:

我会考虑将其存储在代码内的优化数据结构中并手动更新。性能提升将是巨大的,而且由于谷歌会为此向你收费,你最终会感谢它。

我们的想法是将这种固定的数据结构与您的数据库混合,因此您可以为每个国家(或其他)指定一个 id,并在您的模型中引用它。

一种简单的方法是制作一个国家/地区列表,每个国家/地区都有一个州列表。在运行应用程序之前,您可以在 def main(): 中加载它们。当然如果你不小心会带来各种各样的问题,但如果你不小心,你应该没问题。

一种更高级的方法是在内存中只保留最常用的、动态延迟加载和转储国家/地区。

【讨论】:

  • “当然,如果你不小心,这会带来各种各样的问题” - 什么问题?我对 Python 和 GAE 真的很陌生,所以我没有看到那里的确切问题。也感谢您的回答 - 真的很有帮助。 :) 在类似常量的 .py 脚本中定义数据结构怎么样?这会类似于您上面提到的主要方法吗?
  • 当然,在运行应用程序之前运行,def main(): 是个好地方。
  • 我看到可能发生的一个问题是将一个国家/地区分配和 id,然后出现一个新的开发人员,对其进行更改,并且您的洞数据库不再有意义。这就是为什么我说你应该小心,就像你是一个 MySql 引擎一样!
  • 感谢您的回复 - 数据库中没有它确实使 ID 部分很重要,需要整理。再次感谢您。
  • 我不建议在 main.js 中添加东西。这会在每次调用时运行,而不仅仅是在导入时。在模块级别执行,或者在代码中第一次需要它时执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多