我正在创建一个应用程序,在那里我需要制作Post Feeds。现在我使用的是App Engine Standard和Cloud SQL实例db-n1-Standard-1,它是基于MySQL
的,但我注意到它非常昂贵。应用程序处于生产模式,第一个月的价格远高于我的预期。Cloud SQL中成本最高的是实例小时数,因此,我决定在数据存储上迁移它。
我有三个表,1-用户2-帖子3-论每个表都有大约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
我需要获得帖子数据以及文章评论我知道我需要使用JOIN
。我可以很容易地在云SQL中使用它,因为它是基于MySQL的。
这三个表之间有关系,我知道Cloud SQL是关系数据库,但DataStore不是。
我脑海中有一个转换DataStore中这些表的想法
1-将实体创建为Users
,并将所有用户记录保存在那里2-将实体创建为Posts
,并将所有帖子记录保存在那里3-将实体创建为Comments
,并将所有评论记录保存在中
帖子id总是我知道我需要为哪个帖子获取数据
例如,我需要发布关于idp098
的数据,我正在使用Java我决定创建两个threads
第一个线程从Posts
实体获取post
数据,第二个线程线程从CCD_ 15实体中获取CCD_。然后我用java将这两个数据集合并,生成与JOIN
相同的结果,就像MySQL
一样,因为我认为DataStore不允许JOINS
这里我需要一些建议。
- 这样做好吗
- 在这种情况下,哪种表现最好
- 如果成千上万的用户(大量用户)同时访问帖子和评论数据哪一个能处理得更好
- 如果我在这种情况下从云SQL迁移到DataStore,那么定价效果如何情况
- 如果您的应用程序需要连续数据库,则SQL实例运行连续数据库成本高,不是吗?例如在我的应用程序中,每个用户在打开应用程序时都需要显示帖子是大量的用户,那么我认为SQL实例永远不会关闭。哪一个意味着它在一个月内运行730小时
- 有什么建议吗
我会把Comments作为Posts的子实体。对于您的Join,按祖先查询比其他查询更快。
我可能也有帖子作为用户的子实体
所以你最终会得到这样的结构:
| User, 123 | --> | Post, 456 | --> | Comment, 789 |
(Grand Dad) (Dad) (Child)
编辑:Tim Hoffman是对的,评论应该是"用户"的子代,而不是"用户>帖子"。