繁体   English   中英

在MySql /父子关系中链接不同表中的列

[英]Linking columns in different tables in MySql / parent-child relation

我有两张桌子。 “用户”和“电影”。 用户表由“ id”(自动递增),“名称”和“密码”列组成。 现在有2个用户名存储。 电影表中有“标题”和“年份”列。 PHP脚本允许每个用户观看新电影并将其添加到他们的列表中。 如何链接或建立父子关系,或在MySQL中使其发生关系所需的一切? 哦,我也使用Adminer。 现在,当我登录一个用户时,仍然可以看到与其他用户添加的电影相同的电影。

如果您坚持只使用注释中所述的两个表,则必须重新设计Movies表以包括一列UserID,该ID标识哪个用户创建了该条目。 然后,您可以过滤数据,以便用户仅看到有关他们添加到列表中的电影的信息。

这不是一个很好的设计- 杰里米·史密斯Jeremy Smyth)回答表明,有一个额外的表格将电影与用户联系起来更为明智,但您已表明这是不允许的。 设计不佳的原因是,最终将出现很多行,这表明同一部电影是在同一年发行的,每一行都由不同的用户输入,因此没有必要重复。 还有更多的出错机会; 您将获得只有一年(1939年)的“飘”(1938年),“飘”(1939年)和“飘”(1940年)条目。


您能不能更具体地说明我必须做什么...

在仅两张桌子的系统中,您将创建Movies表,如下所示:

CREATE TABLE Movies
(
     Title    VARCHAR(32) NOT NULL,
     Year     INTEGER NOT NULL,
     UserID   INTEGER NOT NULL REFERENCES Users(ID),
     PRIMARY KEY(Title, Year, UserID)
);

当您将记录插入此表时,您记录的是插入用户的ID,因此您可以查询创建了哪些电影记录的用户。

如果实际上要从数据库的其他位置引用该表,则可以在此处添加一个ID列,但是如果有更多表,则可以从该表中删除UserID列并创建一个关系表:

CREATE TABLE Movies
(
     ID       INTEGER AUTOINCREMENT PRIMARY KEY,
     Title    VARCHAR(32) NOT NULL,
     Year     INTEGER NOT NULL,
     UNIQUE(Title, Year)
);

CREATE TABLE Users_Movies
(
    MovieID   INTEGER NOT NULL REFERENCES Movies(ID),
    UserID    INTEGER NOT NULL REFERENCES Users(ID),
    PRIMARY KEY(MovieID, UserID)
);

现在,您可以为“ Gone With the Wind”(1939年)创建一条记录,该记录的ID号为207,二十个人可能将MovieID 207列为他们的一部电影,并在Users_Movies表中列出20条简单记录。

您将需要在两个表之间创建“多对多”关系。

去做这个:

  • 首先,在“ Movies表中创建一个ID列,以唯一地标识每个
  • 然后,创建另一个名为user_movies (或“已观看”或有用的东西)的表,其中包含用户ID,电影ID和您希望添加的任何其他信息,例如观看日期或评分(“星号”)等。

然后,每当用户观看电影时,都将一条记录添加到user_movies表中,以标记他们已经完成了这一事实。

它应该是多对多的,因为每个用户可以观看几部电影,但是每部电影可以由多个用户观看。 在这种情况下,“父子”关系不适合,因为是一对多关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM