Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有int和varchar字段的表的Mysql主键?_Mysql_Database Design_Primary Key_Composite Primary Key - Fatal编程技术网

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

具有int和varchar字段的表的Mysql主键?,mysql,database-design,primary-key,composite-primary-key,Mysql,Database Design,Primary Key,Composite Primary Key,我有一张电影表,想储存其他片名。我将在另一个表中存储替代标题/别名。但我不确定什么是最好的主键 我将有一个movie_id INT字段和一个别名varchar255字段。既然一部电影可以有多个别名,那么主键是否应该在两个字段上?我是否应该为主键添加另一个字段,例如alias_id,它只是自动递增,但除此之外没有任何用途。或者这个表需要主键吗?也许它应该在别名上有一个唯一的索引,而不需要主键?在所有情况下都将主键放在id字段上,因为数据存储效率高,匹配搜索操作快速。如果要强制唯一性,请在除主键之外

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


我将有一个movie_id INT字段和一个别名varchar255字段。既然一部电影可以有多个别名,那么主键是否应该在两个字段上?我是否应该为主键添加另一个字段,例如alias_id,它只是自动递增,但除此之外没有任何用途。或者这个表需要主键吗?也许它应该在别名上有一个唯一的索引,而不需要主键?

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

您的电影id可以是您唯一的PK并自动递增。然后在备选别名表中创建一个FK movie_id,以将备选名称与其原始标题匹配

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

要直接回答问题,请将电影id设置为alt name表中的外键。然后最简单的事情可能是创建一个单独的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

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

主键与高效和快速无关。它只是一个唯一的索引,就像其他索引一样。这是主要的,因为作为程序员/DBA,我们决定该键应该是它所在行的唯一标识符,但这纯粹是为了方便起见。唯一索引和主索引之间没有内部区别,只有一个小标志指示它是主索引。它们的处理方式是相同的。@Marc:主键是索引这一事实是如何使它无效的?如果有人说,将X作为索引是无用的,但将其作为主键是有效的,那就不太可能是真的。我想如果你的意思是你可以制作一个坏的主键和一个好的其他索引,然后永远不要使用主键,而是总是使用其他索引。@Jay:听起来好像hmd说主键可以让事情更快。这是正确的,但只是因为PK是一个索引。在不需要PK的表上打PK在某种程度上是一种cargo cult编程。@Marc B,数据存储的效率是因为rdb(例如mysql内核)使用主键创建外部引用。因此,当您希望从另一个表引用该表时,引擎使用一个存储在几个字节中的整数,在本例中,该整数唯一地指向主表@杰伊,当然。。。但有些引擎强制创建一个名为primaryindex的主键,这是因为引擎的内部操作。理论上,你可以使用BLOB作为主要元素,但我建议使用整数来轻松地在元组之间进行交叉引用!!外键不需要主键。您可以使用所需的任何键或键的组合,只要它/它们唯一地标识外部记录。是的,主键是最容易使用的,因为它是该记录的标识符,但如果您有备用键,则可以使用它。