1

我有三张表 Movies、MoviesWatched、Person1....n

Movies table:
M_ID, Title, Director, etc..

MovieWatched table:
M_ID, DateWatched, (Person who watched movie)

Person1...n table:
MovieOwned(Same as M_ID), NumberOfViews, ________

基本上,对于每个用户,都会创建一个单独的 Person 表,其中包含其电影库中存在的 MovieID。我正在尝试找到一种将 MovieWatched 表链接到 Person1...n 表的方法。到目前为止,我看到的唯一方法是为行中的每部电影设置一个 P_ID。我正在寻找另一种方法,因为这会使每个 Person 表行始终包含相同的 P_ID。

另一种选择是有一张可以容纳所有人的桌子。这样做的缺点是该表需要 1...n 列来保存movieID,并且会有多个列保留为 NULL。

每个 Person 表在表名本身中都是唯一的,所以我想知道是否可以将表名作为 MoviesWatched 中的字段引用,这样我就不必在每部拥有的电影的行中重复 PersonID。

4

2 回答 2

2

您似乎在描述多对多关系。这通常使用联结表解决:

电影表:
M_ID, Title, Director, etc...

人员表:
P_ID, Name, etc...

电影观看表:
M_ID, P_ID, DateWatched

看看我们如何将任意数量的电影与任意数量的人联系起来?因此,“多对多”。

您可以将相同的概念应用于拥有的电影。

我还会加入参照完整性:数据库将对您的数据实施的约束。在这种情况下,MovieWatched.M_ID 应该是 Movies.M_ID 的外键。与 Person.P_ID 类似。这将防止您的数据库包含孤立记录,或可能存在于 MovieWatched 中但不存在于 Person 或 Movies 中的记录(想象删除一个人但不删除他们观看的电影)。

如果您只想允许每个人观看每部电影一次,您还可以对 MovieWatched (M_ID, P_ID) 设置唯一约束(这通常发生在联结表中,但如果您本质上想要电影日志,则可能对您没有意义看过)。

于 2013-10-08T16:39:28.980 回答
1

您的MoviesWatched表走在正确的轨道上:考虑关系数据库中的表可以表示实体或关系

通过其他表中的 ID 引用电影,您已经完成了一半。你会想对 Persons 做同样的事情:

Movies table:
M_ID, Title, Director, etc..

Person table:
P_ID, Name, Other attributes of an individual person...

MovieWatched table:
M_ID, P_ID, DateWatched

MovieOwned table:
M_ID, P_ID, NumberOfViews

注意后两个表。这些表中的每一个中的一行代表一个特定的人观看或拥有特定电影的实例。实体表中的行数相对较少(代表电影和人物)而关系表中的行数相对较多(代表任何人观看或拥有任何电影的时间)是关系模型的自然结果,并且MySQL 等数据库引擎旨在支持它。

另一个注意事项:从技术上讲,像 NumberOfViews 这样的字段可以通过计算给定人员和电影的 MoviesWatched 表中的条目来计算,然后与该人是否还拥有电影相关联,而不是将字段存储在 MovieOwned 和需要随着时间的推移保持更新。这就是你正确使用这个模型所获得的那种力量!)

于 2013-10-08T16:39:15.707 回答