Mysql 针对用户和前25条建议的数据库设计

Mysql 针对用户和前25条建议的数据库设计,mysql,database,relational-database,Mysql,Database,Relational Database,我有一个MySQL数据库,需要为每个用户存储多达25条建议(当用户访问站点时),下面是我的简单表格,其中包含了用户ID、建议和建议排名: userid | recommendation | rank 1 | movie_A | 1 1 | movie_X | 2 ... 10 | movie_B | 1 10 | movie_A | 2 .... 我预计大约1000万用户,再加上

我有一个MySQL数据库,需要为每个用户存储多达25条建议(当用户访问站点时),下面是我的简单表格,其中包含了用户ID、建议和建议排名:

userid | recommendation | rank
  1    |    movie_A     |   1
  1    |    movie_X     |   2
  ...
  10   |    movie_B     |   1
  10   |    movie_A     |   2
  ....
我预计大约1000万用户,再加上25条建议,将产生2.5亿行。有没有其他更好的方法来设计用户推荐表


谢谢

您是否只需要检索25条建议并将其发送到UI层以供使用? 如果是这种情况,计算建议的系统可以构建一个JSON文档,并根据用户ID更新值。MySQL支持JSON数据类型


如果要对JSON文档执行搜索查询,这可能不是一个好方法。

是否只需要检索25条建议并将其发送到UI层以供使用? 如果是这种情况,计算建议的系统可以构建一个JSON文档,并根据用户ID更新值。MySQL支持JSON数据类型


如果要对JSON文档执行搜索查询,这可能不是一个好方法。

2.5亿行在这样一个简单的表中不是不合理的:

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万用户,但如果您这样做,我希望您将使用一个内存充足的服务器来处理此问题。

2.5亿行在这样一个简单的表中并非不合理:

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万个用户,但如果你这样做,我希望你会使用一个有足够内存的服务器来处理这个问题。

我不知道你的标准是什么,但是你没有考虑到“1-25”的排名,你可以考虑一些评分系统,甚至分数是基于一些计数查询的。(可能是相关电影或其他东西)。我对评分的想法是,数字不必是1-25,没有间隔,而是按降序排序,然后抓取其中的25个。这可能比插入更多内容时不断移动堆栈更容易维护。(需要在插槽3中插入一个,所以现在您必须将3+向上凸起一个才能插入新的3,维护起来有点繁琐。)感谢Nate的输入,但建议将由另一个系统计算并复制到MySQL数据库以供使用。因此完全刷新不是问题。我更感兴趣的是设计一个更好的表,因为当用户访问该站点时,会提供记录。我肯定会让其他人插话,但我只是制作3个表:用户、电影和推荐。推荐表是电影和用户之间的连接表,它有3列-用户id、电影id、排名。这基本上就是你的问题。如果你设置了索引,你应该能够快速连接到用户的25条记录。如果你发现自己有g性能问题,你可以开始去规范化,但这对同步来说是一件痛苦的事情。一部电影改变了它的标题?这里有500万次更新!你目前的系统现在还不错。当你达到1000万用户时,会发生两件事之一:要么你足够富有,可以聘请专业帮助,要么你太富有而不在乎。我不知道你的标准是什么,但是相反D有一个“等级”的1-25,你可以考虑某种评分系统,甚至可能有得分是基于一些计数查询(也许相关的电影或某事).我对评分的想法是,数字不必是1-25,没有间隔,而是按降序排序,然后抓取其中的25个。这可能比插入更多数据时不断移动堆栈更容易维护。(需要在插槽3中插入一个,所以现在您必须将3+向上凸起一个才能插入新的3,维护起来有点繁琐。)感谢Nate的输入,但建议将由另一个系统计算并复制到MySQL数据库以供使用。因此完全刷新不是问题。我更感兴趣的是设计一个更好的表,因为当用户访问该站点时,会提供记录。我肯定会让其他人插话,但我只是制作3个表:用户、电影和推荐。推荐表是电影和用户之间的连接表,它有3列-用户id、电影id、排名。这基本上就是你的问题。如果你设置了索引,你应该能够快速连接到用户的25条记录。如果你发现自己有g性能问题,你可以开始去规范化,但这对同步来说是一件痛苦的事情。一部电影改变了它的标题?这里有500万次更新!你目前的系统现在还不错。当你达到1000万用户时,会发生两件事之一:要么你足够富有,可以聘请专业帮助,要么你太富有而不在乎。