mysql - 表名可以用作另一个表的字段吗?

标签 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。

替代方案是拥有一张可容纳所有人的 table 。这样做的缺点是该表需要 1...n 列来保存电影 ID,并且会有多个列为 NULL。

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

最佳答案

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

电影表:
M_ID、职位、导演等...

人员表:
P_ID、姓名等...

电影观看表:
M_ID、P_ID、观看日期

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

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

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

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

关于mysql - 表名可以用作另一个表的字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19253095/

相关文章:

mysql - 替换sql中数据库中的所有重音

mysql - 如何在sql中为串行数据类型的列创建外键

sql-server - 无法对数据库 "ABC"执行差异备份,因为当前数据库备份不存在

sql-server - 将两个数据库表合并为一个 Vaadin Treetable

php - 如何消除连接过多错误

MySQL选择分隔数据

sql - 部署到 Azure 应用服务时,ASP.NET Core Razor Pages Web 应用程序中的 Active Directory 交互式身份验证不起作用

SQL Server : RowVersion equivalent in Oracle

php - 在不使用 MVC 的情况下从 OpenCart 中的数据库中检索信息

mysql - 选择 SUM() 查询的 MAX()