数据库设计,不重复用户供稿中的项目

时间:2019-04-23 17:25:18

标签: sql database-design architecture nosql

我正在进行数据建模练习,该练习的目的是为新闻提要创建一个数据模型,其中帖子不会重复出现。

如果用户 A 看到过帖子 X ,则帖子 X 永远不会出现在用户 A 的再次喂食。

任何帖子在新闻源中只能出现一次。

为此,我为 SQL NoSQL 数据库创建了以下数据模型。

NoSQL

帖子:

{
    '_id': '56sd78',
    'title': 'this is some post'
}   

用户:

{
    '_id': '6ds7'
    'reads':[
        '56sd78',
        '5sdthj8'

    ] // contains post id 

}

上面,我将用户看到的所有帖子_id作为名为reads的数组字段存储到用户集合中。


SQL

帖子:

| 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相对的单独表格中。


在这种情况下,哪种解决方案最理想?

帖子数量是否与数据库选择有关?

有没有更好的方法来解决这个问题?

2 个答案:

答案 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表中存在的帖子。当用户向下滚动查找较旧的帖子时,您可以开始从较旧的表格中获取数据。

共享:您还需要考虑对数据库用户进行分片以扩展数百万个用户。