表值的多个键?

时间:2010-02-10 05:19:34

标签: php mysql

我确定我的术语是错误的,这可能是谷歌没有帮助我的原因。无论如何这里是我的问题,也许你可以推断我真正的问题是什么......我希望

好吧,假设我有一个名为MOVIE的表格,这个表格包含NameReleaseDateStaring的值(列?)现在我的问题是我怎么做Staring值是否包含多个值?

我是否使用STARSKeyActor1等列制作单独的表格Actor2?来自Staring表的MOVIE值指向STARS表的PK的位置。

  

键|演员1 |演员2 | .....
---------------------------------------- 01 |鲍勃鲍勃|约翰鲍勃| .......
02 |吉姆鲍勃|约翰鲍勃| .......

然而,问题是该表是静态的,需要预设数量的actor。

有没有办法在Actors表的Staring值中存储多个actorID(来自MOVIE表的PK)?例如:

  

姓名| ReleaseDate |   盯着
-------------------------------------
blah | 1999年| 21,46,392,182,30,blah pt2 | 2001 | 3,11,412

无论如何,在这一点上任何事都会有所帮助,我们将不胜感激。

4 个答案:

答案 0 :(得分:1)

在这种情况下,您通常使用3个表:

  • 1个演员数据表;每个演员一行;主键=演员的身份
  • 1张电影资料表;每部电影一行;主键=电影的身份
  • 1个表,作为这些之间的链接;主键=电影的ID +电影的ID


在这里,它意味着:

  • STARS
    • ID
    • 名称
  • MOVIE
    • ID
    • 标题
    • RELEASE_DATE
  • MOVIES_STARS
    • id_movie
    • id_star

而且,要拍电影:

select * 
from movie
where id = X

要获得该电影中的演员:

select stars.*
from stars
    inner join movies_stars on movies_stars.id_star = stars.id
where movies_stars.id_movie = X

如果需要,你甚至可以加入电影表; - )


几个关键字:

答案 1 :(得分:1)

通常,对于“多对多”类型的关系,就像Actors :: Movies一样,你会有一个单独的第三个表,看起来像这样:

autoid | Actor | Movie
----------------------
 1        43      47
 2        36      22
 3        36      28
 4        17      47

其中此表的Actor和Movie列中的值对应于列出Actors和Movies的单独表中的行的主键ID。要获取ID为47的电影的所有演员,您需要查询WHERE Movie = 47;要获得身份为36的演员的所有电影,你可以查询WHERE Actor = 36等等。

答案 2 :(得分:1)

理想情况下,规范化解决方案是有3个表,如下所示:

TABLE Movie:
    MovieID (INT)
    Name (VARCHAR)
    ReleaseDate (DATE)

TABLE Actor:
    ActorID (INT)
    Name (VARCHAR)

TABLE Cast:
    ActorID (INT) 
    MovieID (INT)

此外,这些列通常称为“字段”

答案 3 :(得分:0)

嗯,这是一个非常基本的规范化问题。从你所说的,我可以说你的电影关系不是第一范式。你应该做的是将它标准化为1NF,怎么样?你创建一个弱实体集或关系,比如MOVIE_STAR,它有两个属性,名称和actor。那么你应该将名称和actor都作为主键。请注意,我假设name属性是影片关系的主键。我希望这有助于......只是一个想法!