我正在进行数据建模练习,该练习的目的是为新闻提要创建一个数据模型,其中帖子不会重复出现。
如果用户 A 看到过帖子 X ,则帖子 X 永远不会出现在用户 A 的再次喂食。
任何帖子在新闻源中只能出现一次。
为此,我为 SQL 和 NoSQL 数据库创建了以下数据模型。
帖子:
{
'_id': '56sd78',
'title': 'this is some post'
}
用户:
{
'_id': '6ds7'
'reads':[
'56sd78',
'5sdthj8'
] // contains post id
}
上面,我将用户看到的所有帖子_id
作为名为reads
的数组字段存储到用户集合中。
帖子:
| id | title |
|----|----------------|
| 1 | This is post 1 |
| 2 | This is post 2 |
| 3 | This is post 3 |
用户:
| id | username |
|------|----------|
| 1 | abc |
| 2 | pqr |
| 3 | xyz |
阅读次数:
| id | user_id | post_id |
|------|---------|---------|
| 1 | 1 | 2 |
| 2 | 1 | 3 |
| 3 | 2 | 2 |
上面,我将用户看到的所有帖子id
存储在与用户id
相对的单独表格中。
在这种情况下,哪种解决方案最理想?
帖子数量是否与数据库选择有关?
有没有更好的方法来解决这个问题?
答案 0 :(得分:0)
建议的方法假定问题陈述的约束仅是添加用户已阅读的帖子。
如果规模较小,比如说大约100 qps,则可以继续使用基于RDBMS的解决方案。 但是,如果您希望它能增长,请使用nosql和仅附加方法,最好使用列式DB,因此也要写入多个节点。像
[{
'_id': '6ds7',
'reads': '56sd78'
},
{
'_id': '6ds7',
'reads': '56sd7a'
}
}]
不更新现有集合。 NoSql数据存储在存储中是日志结构化的(仅追加),并且更新不是一个好主意。
答案 1 :(得分:0)
如前所述,您可以在NOSQL中维护新闻源帖子的详细信息,并在RDBMS中维护user_id到post_id的映射。
但是将用户的每个post_id保留在一个表中,将来会遇到性能问题。
在一段时间内,表中每个用户的行数增加了很多。您必须获取该用户的所有记录,并且需要在显示该用户时过滤掉该用户的所有已读帖子。
最好使用一些分区,根据日期窗口拆分数据/行。
让我们假设您有一个特定的模块,该模块为每周创建一个表,并且该周的所有帖子都将进入该表,或者您还可以采用某种分区技术,以根据日期窗口拆分数据。
在显示帖子时,您需要同时从NOSQL表和SQL表中获取数据。最后,合并从两个表返回的数据,然后丢弃SQL表中存在的帖子。当用户向下滚动查找较旧的帖子时,您可以开始从较旧的表格中获取数据。
共享:您还需要考虑对数据库用户进行分片以扩展数百万个用户。