具有int和varchar字段的表的Mysql主键?

时间:2011-04-21 21:25:43

标签: mysql database-design primary-key composite-primary-key

我有一个电影桌,想要存储替代标题。我将把替代标题/别名存储在另一个表中。我不确定什么是最好使用的主键。

我将有一个movie_id INT字段和一个alias varchar(255)字段。主键是否应该在两个字段上(因为一个电影可以有多个别名)?我应该为主键添加另一个字段,例如alias_id只是自动递增,但这不起作用。或者这个表需要主键吗?也许它应该只在别名上有一个唯一索引,并且不需要主键?

3 个答案:

答案 0 :(得分:0)

在所有情况下都将主键放在id字段上,因为数据存储是有效的,匹配搜索操作很快。如果你想强制执行唯一性,请在除主键之外的字段上使用唯一索引。主键默认是必需且唯一的。

答案 1 :(得分:0)

你的movie_id可能是你唯一的PK和自动递增。然后在替代别名表中创建一个FK movie_id以匹配alt。名称及其原始标题。

movie_id  |  Title
--------------------
1     |  "Jaws"
2     |   "Star Trek"
3     |   "Matrix 3"


movie_id   |   Alt_Title
------------------------
1       |   "Death Shark"
1       |   "Tales of the Deep"
3       |   "Neo is Uber"
1       |   "Another Jaws Title"

当您在alt名称表中插入时,您必须在原始标题上进行连接,并将其movie_id拉出以插入。

答案 2 :(得分:0)

要直接回答您的问题,您希望将movie_id设为alt_title表中的外键。那么最简单的事情可能是创建一个单独的alt_title_id字段作为alt_title表的主键。我不会把标题作为主键,因为制作一把好钥匙非常漫长而且很麻烦。

我不确定你对这些数据做了什么,但我的冲动是创建一个表来保存主要和备用标题,然后只有一个标志来识别主要数据。假设您有关于每部电影的大量其他数据,请将标题从基本电影记录中拉出到单独的表格中。如果你把它们放在一个表中,那么如果你想用主要标题或备用标题搜索,你只需要说

select whatever
from movie_title
join movie using (movie_id)
where title='Java Forever'

如果你想出于某种原因只搜索主要标题,那么你可以写

select whatever
from movie_title
join movie using (movie_id)
where title='Java Forever' and primary=true

有两个表,如果你想按主要标题搜索,当然,这很容易。但是如果你想通过主要或备用搜索,你需要一个缓慢而痛苦的联盟。如果查询很复杂,加入其他几个表或拔出一堆字段,那么所有额外的复杂性都必须在连接的每一半中写入两次。