表名是否可以用作另一个表的字段?

时间:2013-10-08 16:20:03

标签: mysql sql sql-server database

我有三个表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。

2 个答案:

答案 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表中的条目,可以计算计算这样的字段,然后将其与是否或不是这个人也拥有这部电影,而不是将该字段存储在MovieOwned上,并且需要随着时间的推移更新它。这就是你正确使用这个模型所获得的那种力量!)