0

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

4

2 回答 2

2

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

这不是一个好的设计——Jeremy Smyth的答案建议使用额外的表格将电影与用户联系起来更明智,但您已经指出这是不允许的。它不是一个好的设计的原因是你最终会得到很多行,表明同一部电影是在同一年发行的,每一行都是由不同的用户输入的,所以会有不必要的重复。出错的机会也更多;您将获得 1938 年的“乱世佳人”、1939 年的“乱世佳人”和 1940 年的“乱世佳人”的条目,而应该只有一年(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 年“乱世佳人”的一条记录,其 ID 号可能为 207,并且 20 个不同的人可能将 MovieID 207 列为他们的电影之一,在 Users_Movies 表中有 20 条简单记录。

于 2012-11-28T13:35:41.340 回答
1

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

去做这个:

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

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

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

于 2012-11-28T12:54:55.620 回答