我有三个表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表在tablename中都是唯一的,所以我想知道是否可以将一个表名称作为MoviesWatched中的一个字段引用,这样我就不必在每个拥有的电影的行中重复PersonID。
答案 0 :(得分:2)
您似乎在描述多对多的关系。这通常使用联结表来解决:
电影表:
M_ID, Title, Director, etc...
人员表:
P_ID, Name, etc...
MovieWatched表:
M_ID, P_ID, DateWatched
了解我们如何将任意数量的电影与任意数量的人联系起来?因此,“多对多。”
您可以将相同的概念应用于所拥有的电影。
我还会提出引用完整性:数据库将对您的数据强制执行的约束。在这种情况下,MovieWatched.M_ID应该是Movies.M_ID的外键。与Person.P_ID类似。这将使您的数据库不会拥有可能存在于MovieWatched中的孤立记录或记录,但不会出现在人物或电影中(想象一下,删除一个人而不是他们观看的电影)。
如果你只想让每个人一次观看每部电影,你也可以对MovieWatched(M_ID,P_ID)设置一个唯一的约束(这通常发生在联结表中,但如果你基本上想要一个,可能对你没有意义观看电影的日志。)
答案 1 :(得分: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之类的数据库引擎旨在支持它。
(另一个注意事项:>从技术上讲,像给出一个人和电影的MoviesWatched表中的条目,可以