0

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

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

4

3 回答 3

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 name 表中进行插入时,您必须在原始标题上进行连接,并提取其 movie_id 以插入。

于 2011-04-21T21:31:15.037 回答
0

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

于 2011-04-21T21:30:12.187 回答
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

有两个表,如果你想按主要标题搜索,当然,这很容易。但是如果你想按primary或​​者alternate来搜索,就需要一个union,这个过程又慢又痛苦。如果查询很复杂,连接其他几个表或提取一堆字段,那么所有额外的复杂性都必须在连接的每一半中写入两次。

于 2011-04-21T21:58:17.630 回答