我现在已经在两个项目中使用了数据存储,但是对于这两个项目我都没有利用祖先的关系。经过大量的阅读和研究,我相信我终于明白了如何设计一个出色的数据存储模型。
想象一个类似于Reddit / Instagram的网站,用户可以在其中创建自己的类别(类似于Subreddits),其他用户可以订阅。用户可以互相关注,不同用户上传的图像将上传到这些类别,并在特定用户的个人资料下显示(如Instagram中)。考虑到这一点,我认为这是理想的设计:
Category
- User
- - Image
- Subscriber
User
- Follower
- Following
使用此数据存储模型,我相信应该可以轻松检索由用户ID'上传的所有图像。或者'类别ID',所有用户订阅'类别ID',所有图片上传到'类别ID'。所有用户关注或被“用户ID”跟随后,用户上传的所有图片都会被'用户ID'。
跟踪。我非常感谢一些数据存储专家的反馈和改进它的潜在方法(我特别好奇在使用'用户'作为两个祖先的过程中是否有任何问题不同的地方,它是一个孩子,在一个地方而不是另一个地方的类别...... ..
我希望这有助于使问题更容易理解/回答:)
我有以下实体:
Category
- ID int64
- Name string
- etc..
User
- Username string (NameKey)
- Password []byte
- etc..
Image
- ID int64
- StorageID string
- MD5Hash string
- etc..
Follow
- ID int64
- Follower string
- Following string
其中Category,User,Image和Follow是实体,ID,Name,Username等是属性名称。
因此,Image实体将来自User(上传图片的人)和Category ancestors
Follow实体将来自User ancestor
对于订阅者,我不确定是否最好制作一个类似于Follow的全新实体(在这种情况下它可能包括用户首次订阅的日期),或者让它成为一个属性
答案 0 :(得分:2)
实体组(具有相同根祖先的所有实体,包括根祖先)在查询时更多地关注一致性单元。这种设计的一个问题是扩展,因为实体组每秒限制为持续的1次交易(你可以突然爆发)。
使用此当前设计,您在单个类别中的所有查询都将非常一致,但您每秒只能限制为1张新图像。
由于对某个类别中的所有图像具有强一致性视图并不像确保您可以处理增长一样重要,因此从根用户实体获取图像可能会更好(所以寻找他们自己的图像的用户非常一致)并且在图像实体的属性中只有一个id。
Category
- ID int64
- Name string
- OwnerUserID string
- etc..
User
- Username string (NameKey)
- Password []byte
- etc..
Image (descends from User)
- ID int64
- StorageID string
- MD5Hash string
- CategoryID int64
- etc..
现在列出用户123的所有图像(强烈一致):
SELECT * FROM Image WHERE __key__ HAS ANCESTOR (User, 123)
列出类别456中用户123的所有图像(强烈一致):
SELECT * FROM Image WHERE __key__ HAS ANCESTOR (User, 123) AND CategoryID = 456
列出类别456中的所有图像(最终一致):
SELECT * FROM Image WHERE CategoryID = 456
列出所有图像(最终一致)
SELECT * FROM Image