所以我正在尝试设计一个相当大的数据库来处理视频及其标签。因为只能为视频选择有限数量的标签(27),所以我将它们存储在28列宽的表格中(每个标签一列+ video_id)。
当我想获得用户喜欢/不喜欢带有特定标签的视频的次数时,我的问题就出现了(比方说#24)。每个Like / Dislike在另一个表中都有一行。
以下是我考虑过的两个选项。
1)在用户表中再添加27个tinyint列,每个列表示他对使用tagX的视频投票的次数。
PRO:轻松选择
CON:每个用户所需的数据量翻倍
2)使用内部联接
PRO:尺寸小
CON:在系统上更难
两者都是因为我是选择性的,因为我正在尝试使用良好的做法,我正在尝试为300,000多名用户优化我的数据库,这些数字将需要很多。我做了数学计算,即使有300,000个用户,它也只会为我的数据库增加大约27兆字节。
怎么做!?
答案 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;