【问题标题】:Where to store cross referenced SQL values?在哪里存储交叉引用的 SQL 值?
【发布时间】:2012-12-14 22:01:40
【问题描述】:

我正在构建一个包含两个表的电影数据库,一个包含电影名称,另一个包含演员姓名。如何交叉引用数据?

例如,电影名称表中的条目应该包含每部电影的演员列表,还是演员名称表中的条目应该包含演员的电影列表?

【问题讨论】:

  • 两者都不是。不要存储列表。它只会导致头痛。请参阅 Michael 的回复以获得良好的标准化设计:)

标签: sql join


【解决方案1】:

您将需要一个额外的表来链接两者,并且至少包含电影 ID 和演员 ID 作为其列。假设您的Actors 表以actor_id 作为其主键,Moviesmovie_id 作为其主键。此表还可以包含有关该电影特定演员的信息,例如角色的姓名或其他与角色相关的信息。

CREATE TABLE actors_in_movies (
  /* Use whatever auto increment keyword is needed for your RDBMS */
  id INT NOT NULL PRIMARY KEY <auto increment>,
  actor_id INT,
  movie_id INT,
  character_name VARCHAR(),
  other_character_info VARCHAR(),
  character_best_quote TEXT,
  FOREIGN KEY (actor_id) REFERENCES actors (actor_id),
  FOREIGN KEY (movie_id) REFERENCES actors (movies_id)
);

查询一个演员出演的所有电影,

使用某些东西来达到以下效果:

SELECT
  actors.*,
  movies.name
FROM
  actors 
  JOIN actors_in_movies ON actors.actor_id = actors_in_movies.actor_id
  JOIN movies ON movies.movie_id = actors_in_movies.movie_id
WHERE actors.actor_id = <some actor id>

要查询特定电影中的所有演员,

使用某些东西来达到以下效果:

SELECT
  actors.*
FROM
  actors 
  JOIN actors_in_movies ON actors.actor_id = actors_in_movies.actor_id
  JOIN movies ON movies.movie_id = actors_in_movies.movie_id
WHERE movies.movie_id = <some movie id>

要将演员添加到电影中,请在 actors_in_movies 表中插入一行:

INSERT INTO actors_in_movies (actor_id, movie_id) VALUES (..., ...);

【讨论】:

  • 我可能会在这种情况下的关系表上放置一个代理键,因为他可能希望每部电影的每个演员都有多个条目。想想 Eddie Murphy,他在同一部电影中扮演了 4 个角色。
  • 我无法形容我印象深刻。提出问题,敬酒,问题回答得比我想象的要彻底。谢谢!
  • @Kratos 欢迎来到 Stack Overflow - 通常你甚至没有时间烤面包 :)
【解决方案2】:

使用交叉表!有一个只有两列的表:movieID、actorID。

【讨论】:

    【解决方案3】:

    您应该有第三张表,名为ActorInMovie。该表应有 2 列。 ActorID, MovieID

    这样,你就可以拥有多对多的关系了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多