用户数据库设计和前 25 条建议
Database design for user and top 25 recommendations
我有一个 MySQL 数据库,需要为每个用户存储最多 25 条推荐(当用户访问网站时),这是我的简单 table,其中包含用户 ID、推荐和排名对于推荐:
userid | recommendation | rank
1 | movie_A | 1
1 | movie_X | 2
...
10 | movie_B | 1
10 | movie_A | 2
....
我预计大约有 1000 万用户,加上 25 条建议将产生 2.5 亿行。还有其他更好的方法来设计用户推荐table吗?
谢谢!
您的要求是否仅检索 25 个推荐并将其发送到 UI 层以供消费?
如果是这种情况,计算推荐的系统可以构建一个 JSON 文档并根据 Userid 更新值。 MySQL 支持 JSON 数据类型。
如果您想对 JSON 文档执行搜索查询,这可能不是一个好的方法。
2.5 亿行在一个简单的 table 中并非不合理:
CREATE TABLE UserMovieRecommendations (
user_id INT UNSIGNED NOT NULL,
movie_id INT UNSIGNED NOT NULL,
rank TINYINT UNSIGNED NOT NULL,
PRIMARY KEY (user_id, movie_id, rank),
FOREIGN KEY (user_id) REFERENCES Users(user_id),
FOREIGN KEY (movie_id) REFERENCES Movies(movie_id)
);
每行 9 个字节。所以只有大约2GB。
25 * 10,000,000 * 9 bytes = 2250000000 bytes, or 2.1GB.
考虑到索引等等,可能会加倍。仍然不难想象 MySQL 服务器配置为将整个数据集保存在 RAM 中。而且可能没有必要将所有数据保存在 RAM 中,因为并非所有 1000 万用户都会同时查看他们的数据。
您可能永远不会达到 1000 万用户,但如果您达到了,我希望您将使用内存充足的服务器来处理这个问题。
我有一个 MySQL 数据库,需要为每个用户存储最多 25 条推荐(当用户访问网站时),这是我的简单 table,其中包含用户 ID、推荐和排名对于推荐:
userid | recommendation | rank
1 | movie_A | 1
1 | movie_X | 2
...
10 | movie_B | 1
10 | movie_A | 2
....
我预计大约有 1000 万用户,加上 25 条建议将产生 2.5 亿行。还有其他更好的方法来设计用户推荐table吗?
谢谢!
您的要求是否仅检索 25 个推荐并将其发送到 UI 层以供消费? 如果是这种情况,计算推荐的系统可以构建一个 JSON 文档并根据 Userid 更新值。 MySQL 支持 JSON 数据类型。
如果您想对 JSON 文档执行搜索查询,这可能不是一个好的方法。
2.5 亿行在一个简单的 table 中并非不合理:
CREATE TABLE UserMovieRecommendations (
user_id INT UNSIGNED NOT NULL,
movie_id INT UNSIGNED NOT NULL,
rank TINYINT UNSIGNED NOT NULL,
PRIMARY KEY (user_id, movie_id, rank),
FOREIGN KEY (user_id) REFERENCES Users(user_id),
FOREIGN KEY (movie_id) REFERENCES Movies(movie_id)
);
每行 9 个字节。所以只有大约2GB。
25 * 10,000,000 * 9 bytes = 2250000000 bytes, or 2.1GB.
考虑到索引等等,可能会加倍。仍然不难想象 MySQL 服务器配置为将整个数据集保存在 RAM 中。而且可能没有必要将所有数据保存在 RAM 中,因为并非所有 1000 万用户都会同时查看他们的数据。
您可能永远不会达到 1000 万用户,但如果您达到了,我希望您将使用内存充足的服务器来处理这个问题。