【发布时间】: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
这里我需要一些建议。
- 这是一个好方法吗?
- 在这种情况下哪个提供最佳性能?
- 如果成千上万的用户(大量用户)同时访问帖子和评论数据 哪一个比较好?
- 如果我从 Cloud SQL 迁移到 DataStore,定价效果如何? 情况?
- 如果您的应用程序需要连续数据库,那么 SQL 实例会连续运行 让它的成本很高,不是吗? 例如在我的应用中,每个用户在打开应用时都需要显示帖子(如果有) 是大量用户,那么我认为 SQL 实例永远不会关闭。哪个 意味着它在一个月内运行 730 小时。
- 有什么建议吗?
【问题讨论】:
-
数十亿用户?
-
大量用户正在使用此应用
-
是的,但是由于整个地球的人口还不到 80 亿……十亿,真的吗?
-
哎呀,我只是用Billion来代表大量用户。好的,可能有数千
-
你在使用objectify吗?
标签: java google-app-engine google-cloud-datastore google-cloud-sql