为简单起见,假设我的数据库有两个表,视频和用户。 视频是不同视频的列表,用户是不同用户的列表。
我需要能够记录用户何时观看某个视频,所以当他们再次观看视频时,我可以让他们知道他们已经看过了。
的信息: 可能会有数十万用户 可能会有数十万个视频。
我想到这样做的一种方法是为每个视频创建一个表,或者为每个用户创建一个表(两者都会产生数十万个表)。
另一种方法是创建一个中性表,其字段为:userID(外键),videoID(外键)。但是,我认为这会影响效率(和规范化),因为存在多值依赖关系,或两列中相同userID和videoID的倍数。
我对数据库还是比较陌生的,我觉得我错过了一些简单的东西。任何帮助将不胜感激。
我正在使用MySQL。
答案 0 :(得分:7)
您的数据库应该有users
的表格,videos
的表格和userViews
的表格。 userViews
包含字段userId
和videoId
以及时间/日期字段。当人们观看视频时填写。
标准化不会受到影响。
答案 1 :(得分:1)
你的“另一种方式”的想法是正确的。它被称为junction or join table,并且在您需要多对多关系时经常使用。除了UserId
和VideoId
之外,您还需要添加WatchedDateTime
列来跟踪观看时间。
维基百科图片示例:
不要制作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的第三个表,它将通过外部引用这两个表键。如果您为第三个表提供时间戳,则会显示用户观看视频的时间。