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

时间:2012-11-28 12:44:41

标签: mysql parent-child

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

2 个答案:

答案 0 :(得分:2)

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

这不是一个好的设计 - answer Jeremy Smyth建议将电影与用户联系起来的额外表更为明智,但您已经指出这是不允许的。它不是一个好设计的原因是你最终会有很多行表明同一部电影是在同一年发布的,每一行都是由不同的用户输入的,因此不必要的重复。错误的机会也更多;你会得到1938年的“乱世佳人”和1939年的“乱世佳人”,以及1940年的“乱世佳人”,1900年只有一年(1939年,正好相反)。


  

请您更具体地了解我必须做的事情......

在仅有两个表的系统中,您可以像这样创建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)
);

现在你可以拥有1939年的“Gone With The Wind”的一条记录,可能有ID号207,而且20个不同的人可能会将MovieID 207列为他们的一部电影,在Users_Movies表中有20条简单记录。

答案 1 :(得分:1)

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

要做到这一点:

  • 首先,在ID表格中创建一个Movies列,以便唯一标识每一个
  • 然后,创建另一个名为user_movies(或“已观看”或有用的内容)的表,其中包含用户ID,电影ID以及您要添加的任何其他信息,例如观看日期或评级(数字) “星星”等等。

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

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