如何设计数据库来处理哪些用户观看了哪些视频?

时间:2012-02-16 20:10:05

标签: mysql sql database database-design database-normalization

为简单起见,假设我的数据库有两个表,视频和用户。 视频是不同视频的列表,用户是不同用户的列表。

我需要能够记录用户何时观看某个视频,所以当他们再次观看视频时,我可以让他们知道他们已经看过了。

的信息: 可能会有数十万用户 可能会有数十万个视频。

我想到这样做的一种方法是为每个视频创建一个表,或者为每个用户创建一个表(两者都会产生数十万个表)。

另一种方法是创建一个中性表,其字段为:userID(外键),videoID(外键)。但是,我认为这会影响效率(和规范化),因为存在多值依赖关系,或两列中相同userID和videoID的倍数。

我对数据库还是比较陌生的,我觉得我错过了一些简单的东西。任何帮助将不胜感激。

我正在使用MySQL。

4 个答案:

答案 0 :(得分:7)

您的数据库应该有users的表格,videos的表格和userViews的表格。 userViews包含字段userIdvideoId以及时间/日期字段。当人们观看视频时填写。

标准化不会受到影响。

答案 1 :(得分:1)

你的“另一种方式”的想法是正确的。它被称为junction or join table,并且在您需要多对多关系时经常使用。除了UserIdVideoId之外,您还需要添加WatchedDateTime列来跟踪观看时间。

维基百科图片示例:

enter image description here

不要制作UserId和VideoId的复合键,因为这不会让你录制多个观看。

答案 2 :(得分:0)

像在option2中提到的那样拥有依赖关系/关系/链接/连接/联结表将是完美的。更确切地说,您可能希望将该组合键(UserId,VideoId)设置为主要/唯一约束,以便可以避免重复。

答案 3 :(得分:0)

您希望在T-SQL中研究多对多关系:http://www.singingeels.com/Articles/Understanding_SQL_Many_to_Many_Relationships.aspx

一旦您熟悉了这一点,请确保您在用户和视频表中有明确的标识列(INT将起作用),然后创建一个名为UserVideos的第三个表,它将通过外部引用这两个表键。如果您为第三个表提供时间戳,则会显示用户观看视频的时间。