【问题标题】:Migrate from Cloud SQL to DataStore从 Cloud SQL 迁移到 DataStore
【发布时间】:2017-10-31 17:19:53
【问题描述】:

我正在创建需要制作帖子提要的应用程序。现在我正在使用基于 MySQL 的 App Engine Standard 和 Cloud SQL 实例 db-n1-standard-1 但我注意到它非常昂贵。应用程序处于生产模式,第一个月的价格远高于我的预期。 Cloud SQL 中最昂贵的东西是 实例小时费率 所以,我决定将它迁移到数据存储上。

我有三个表,1- users 2- posts 3- cmets 而且每张桌子都有大约 1000 万 行。 帖子和评论表是 预计增长非常快 1 亿行。

用户表

user_id         name        email           phone
--------------------------------------------------
u123            Abc         abc@m.com       123456
u124            Cde         cde@m.com       789065
u786            Qwe         qwe@m.com       754599
 .               .              .               .
 .               .              .               .
 .               .              .               .

帖子表

post_id         user_id         type        src                 date
------------------------------------------------------------------------
p098            u123            img         path/to/file        13-3-17
p456            u123            vid         path/to/file        14-3-17
p239            u124            img         path/to/file        15-3-17
 .               .               .              .                   .
 .               .               .              .                   .
 .               .               .              .                   .

评论表

cmnt_id         post_id         user_id         comment
--------------------------------------------------------
m392            p098            u123            Some Text
m234            p098            u786            Some Text
m324            p456            u123            Some Text
 .               .               .                .
 .               .               .                .
 .               .               .                .

如您所见User 可以发布一个或多个 posts 和单个post 一个或多个 comments

我需要获取 posts 数据以及 post cmets 我知道我需要使用 JOIN 为此。而且我可以在 Cloud SQL 中轻松使用它,因为它基于 MySQL。

这三个表之间有关系,据我所知 Cloud SQL 是关系数据库,但 DataStore 不是。

我有想法在 DataStore 中转换这些表

1- 将实体创建为Users 并将所有用户记录保存在那里 2-将实体创建为Posts并将所有帖子记录保存在那里 3 - 将实体创建为Comments 并将所有 cmets 记录保存在那里

帖子 ID 总是让我知道我需要为哪个帖子获取数据

例如,我需要发布关于 id p098 的数据,我正在使用 Java 我决定创建两个 threads 第一个线程从 Posts 实体获取 post 数据,第二个线程 线程从Comments 实体获取comment 数据。然后我使用java合并这两个数据集以生成与JOIN相同的结果就像MySQL因为我认为DataStore不允许JOINS

这里我需要一些建议。

  1. 这是一个好方法吗?
  2. 在这种情况下哪个提供最佳性能?
  3. 如果成千上万的用户(大量用户)同时访问帖子和评论数据 哪一个比较好?
  4. 如果我从 Cloud SQL 迁移到 DataStore,定价效果如何? 情况?
  5. 如果您的应用程序需要连续数据库,那么 SQL 实例会连续运行 让它的成本很高,不是吗? 例如在我的应用中,每个用户在打开应用时都需要显示帖子(如果有) 是大量用户,那么我认为 SQL 实例永远不会关闭。哪个 意味着它在一个月内运行 730 小时
  6. 有什么建议吗?

【问题讨论】:

  • 数十亿用户?
  • 大量用户正在使用此应用
  • 是的,但是由于整个地球的人口还不到 80 亿……十亿,真的吗?
  • 哎呀,我只是用Billion来代表大量用户。好的,可能有数千
  • 你在使用objectify吗?

标签: java google-app-engine google-cloud-datastore google-cloud-sql


【解决方案1】:

我会将评论作为帖子的子实体。按祖先查询比其他查询更快。

我可能也有帖子作为用户的子实体

所以你最终会得到这样的结构:

| User, 123 | --> | Post, 456 | --> | Comment, 789 | (Grand Dad) (Dad) (Child)

编辑:蒂姆霍夫曼是对的,评论应该是“用户”而不是“用户 > 帖子”的孩子。

【讨论】:

  • 谢谢你,但其他人呢?
  • 对不起,我不明白。还有什么?你只提到3张桌子对吧?每个实体种类都“像”一个表。唯一的区别是当你创建一个实体时,你可以在它的键中定义一个“祖先”。举个例子,当你创建一个 Post 时,你可以说它的 key 是:['User', 123, 'Post']。这意味着它的祖先是“User, 123”,如果不向“Post”提供 id,它将在保存时自动生成。
  • 但是当我读到每个祖先都在同一个实体组中并且实体组存储在同一个数据存储节点中时,这使得它的可扩展性很低,对吗?
  • 例如,我们可以在帖子实体中添加 user_id 并按属性过滤。哪一个是好祖先或按属性过滤。因为每个用户都有大量的用户和大量的帖子。我担心实体组的可扩展性是否太大。
  • 就我个人而言,我会将帖子设为用户的孩子(原始帖子的所有者),但评论用户的孩子(评论的发布者)存储原始帖子的 id。将 cmets 作为孩子的主要问题将限制吞吐量(可能不是问题)。但谁拥有评论?如果评论是对评论的回复,则保留对父评论 id 的引用。
猜你喜欢
  • 2019-06-25
  • 2021-11-09
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多