MySQL:更多列与更多查询

时间:2011-01-09 08:00:39

标签: mysql sql

所以我正在尝试设计一个相当大的数据库来处理视频及其标签。因为只能为视频选择有限数量的标签(27),所以我将它们存储在28列宽的表格中(每个标签一列+ video_id)。

当我想获得用户喜欢/不喜欢带有特定标签的视频的次数时,我的问题就出现了(比方说#24)。每个Like / Dislike在另一个表中都有一行。

以下是我考虑过的两个选项。

1)在用户表中再添加27个tinyint列,每个列表示他对使用tagX的视频投票的次数。
PRO:轻松选择
CON:每个用户所需的数据量翻倍

2)使用内部联接
PRO:尺寸小 CON:在系统上更难

两者都是因为我是选择性的,因为我正在尝试使用良好的做法,我正在尝试为300,000多名用户优化我的数据库,这些数字将需要很多。我做了数学计算,即使有300,000个用户,它也只会为我的数据库增加大约27兆字节。

怎么做!?

3 个答案:

答案 0 :(得分:4)

(这只是我的意见)

我认为你过早地进行了优化(可能不正确)。加入并不贵。您应该有一个用户表,一个标签表和一个类似的表。根据您的确切查询,您可能会发现这稍微便宜一些。

最好花时间确保拥有正确的索引,而不是创建一个专为维护而设计的布局。

答案 1 :(得分:1)

你的批判理性是有缺陷的。今天你可能认为27个视频是最大的,但将来总会有另外一个或两个或更多。

答案 2 :(得分:0)

只有27个不同的标签,才能使用27列到用户表。因此,添加另一个标签需要架构更改(这是一件坏事)。

我投票支持这样的事情:

table users(
   user_id
  ,primary key(user_id)
);

table videos(
   video_id
  ,primary key(video_id)
);

table tags(
   tag_id
  ,tag_name
  ,primary key(tag_id)
);

table video_tags(
   video_id
  ,tag_id
  ,primary key(video_id, tag_id)
);

table user_likes(
   user_id
  ,video_id
  ,primary key(user_id, video_id)
);

要显示每个标签的投票数,您可以执行以下操作:

select c.tag_name
      ,count(*)
  from user_likes a
  join video_tags b uing(video_id)
  join tags       c using(tag_id)
 where a.user_id = ?
 group 
    by c.tag_name;