google-app-engine - 关系数据模型到 Google 数据存储映射

标签 google-app-engine transactions google-cloud-datastore gaelyk

首先,我来自 RDBMS/SQL/C++/Java/Python 背景并且我是新手
到 Gaelyk、Google API 和 Google 数据存储区。

我喜欢建模(对代码使用流程图,对数据库使用 DB 建模工具)
在我编码之前。
过去我大量使用 Erwin 来进行数据库建模。

在 Erwin 中,我设计了一个我想要的数据库的逻辑/物理数据模型
将 Google 数据存储区和 Gaelyk 与 Google AppEngine SDK 结合使用来实现。

我想在编写任何代码之前设计数据布局。
我选择的设计工具是 Erwin Data Modeler。

当我查看 Google 数据存储区时,我看到了那里
没有关系约束,连接是通过
完成的 WHERE 子句:绑定(bind)变量。

如何将现有模型(具有 PK/FK、依赖实体、大量关系链接)映射到 Google 数据存储区?

有没有可以让我为 Google 数据存储区进行设计的建模工具?
数据库设计是否应该从 Gaelyk MVC 模式和直接编码开始?
我不习惯这个,因为我来自 RDBMS 背景,你在其中大量建模
所有美好的事物都来自良好的关系设计。

此外,在使用命令式语言(C++、C、Java、Python)编写数据库客户端应用程序之前,
我喜欢写伪代码,但首先是数据库设计(如果应用
有一个数据库后端)

我做错了吗?看起来有一套工具可供我使用
开始编码,但没有设计工具集。

附录:
这是我试图映射的逻辑模型 Model

我将如何映射循环关系
account --(1:m)-- following --(m:1)-- following_account_id --(1:1)-- account_id?

最佳答案

一般来说,App Engine 数据存储区以及所有非关系数据库的指导原则是“针对读取进行优化”。简而言之,这意味着去规范化、去规范化、去规范化。在某些情况下,这会使更新变得更加困难——例如,如果您将用户名作为帐户表的主键,而用户想要更改用户名——并且在某些情况下,这将需要复制数据,例如存储持久计数。不过,所有这一切都是值得的,因为它提供了更好的读取性能和可扩展性,并且在典型的 Web 应用程序中,读取数量比写入数量高出数百比一。

特别是您的模型,它非常规范化 - 甚至比我见过的大多数 RDBMS 模型都要规范化。一些建议:

  • 将“user_name_id”之类的内容汇总到您的主帐户表中。
  • 对于“关注”之类的内容,如果某人关注的人数通常很少 (<1000),则使用列表属性,或者 fan-out pattern否则。
  • 在可行的情况下为每个表选择一个合理的主键,例如用户名或电子邮件,并将其用作键名。这允许使用 get 操作而不是查询来查找记录,后者的速度要快得多。
  • 当需要查找表(如“帐户类型”)时,请确保外键具有足够的描述性,您只需查找相应的管理操作记录即可。更好的做法是,将像这样的小的、不经常更改的详细信息存储在数据存储外部,以便可以立即访问它们。
  • 对于标签之类的东西,使用列表属性可以减少查找相关实体的次数,并使索引更容易。

当然,这只是表面现象,在 SO、群组和博客上收集了大量智慧 like mine .欢迎回来询问有关数据建模的具体问题!

要回答您的其他问题,不,据我所知,没有特定于 GAE 的数据建模工具,但您可以使用现有的标准图表工具。模型确实是在代码中定义的,因为数据存储是无模式的,但这不一定是您实现事物的顺序的障碍。

关于google-app-engine - 关系数据模型到 Google 数据存储映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6989633/

相关文章:

python - protoRPC:返回字典

database-design - 如何移动排序列表中的元素并保持 CouchDb 写入 "atomic"

Spring集成: difficulty with transaction between 2 activators

google-cloud-datastore - Firestore 更新的费用与写入费用相同吗?

python - GAE/webapp2 : Serving Excel file created by script using xlwt

google-app-engine - 授予 Google Cloud Storage REST API 的目录级权限

php - 网址错误 0 : The cURL request was retried 3 times and did not succeed

database - 在数据库事务中读取查询

python - 数据存储中的一对多关系

python - 每次调用 put 时 auto_now_add 属性是否都会更新?