【问题标题】:Can a table name be used as a field for another table?一个表名可以用作另一个表的字段吗?
【发布时间】:2013-10-08 16:20:02
【问题描述】:

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

【问题讨论】:

  • 非常糟糕的设计。有一个带有字段的person 表,用于标识记录属于哪个人。那么你的问题就变得没有意义了。作为一般经验法则,任何需要基于数据库中其他字段的多个表的设计都可以使用单个表更容易地完成,并将“其他字段”值作为字段放入一个表中。
  • 非常糟糕的设计。这将导致维护噩梦,根本没有理由这样做。
  • 我的理由是防止多个字段保留为 NULL。我对数据库设计非常陌生,我认为如果我使用多个表进行操作,整个数据库会更小,因为每部电影都不会有多个列为空。使用一张表,设计将类似于:P_ID,Movie1.....n = M_ID。这还是更好的做法吗?
  • 嗯,我这样做的原因是每个用户都可以从电影表中提取他们自己的电影列表,其中包含电影。我需要某种方式列出每个人在他们自己的个人电影列表中拥有的电影。一个 people 表将包含与 movies 表中的行一样多的列。
  • @user2780385 你走在正确的轨道上。请参阅我的答案以了解您应该考虑的内容。 :)

标签: mysql sql sql-server database


【解决方案1】:

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

电影表:
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) 设置唯一约束(这通常发生在联结表中,但如果您本质上想要观看电影的日志)。

【讨论】:

    【解决方案2】:

    您的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 上并需要随着时间的推移保持更新。这就是正确使用此模型所获得的力量!)

    【讨论】:

    • 太棒了!这正好解决了我想要完成的事情。很棒的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 2015-01-13
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    相关资源
    最近更新 更多