我有一个电影桌,想要存储替代标题。我将把替代标题/别名存储在另一个表中。我不确定什么是最好使用的主键。
我将有一个movie_id
INT
字段和一个alias
varchar(255)
字段。主键是否应该在两个字段上(因为一个电影可以有多个别名)?我应该为主键添加另一个字段,例如alias_id
只是自动递增,但这不起作用。或者这个表需要主键吗?也许它应该只在别名上有一个唯一索引,并且不需要主键?
答案 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
有两个表,如果你想按主要标题搜索,当然,这很容易。但是如果你想通过主要或备用搜索,你需要一个缓慢而痛苦的联盟。如果查询很复杂,加入其他几个表或拔出一堆字段,那么所有额外的复杂性都必须在连接的每一半中写入两次。