索引和外键有什么区别?

时间:2009-11-13 23:08:47

标签: mysql database foreign-keys primary-key

我想创建一个包含3个表的数据库。一个用于帖子,一个用于标签,一个用于将帖子链接到标签,其中post_id和tag_id用作外键引用。

您能解释一下这个场景中的索引是什么吗?它与外键的区别以及它对我的数据库设计有何影响?

6 个答案:

答案 0 :(得分:14)

表上的索引是一种数据结构,可以快速有效地随机访问行。它也有助于优化表的内部组织。

外键只是指向另一个表中相应列的指针,该表在两个表之间形成引用约束。

答案 1 :(得分:4)

第三个表格中有外键。索引不是必需的,如果您有很多数据需要快速找到ID,则需要索引。也许你会想要帖子主键的索引,但DBMS可能会自动创建它。

索引是一种冗余数据结构,可加快某些查询速度。 对于实际问题,外键是一种确保表中行之间没有无效指针的方法(在您的情况下,从关系表到帖子和标记)

答案 2 :(得分:3)

添加索引作为快速查找表中的数据。 索引可以有约束,因为用于生成索引的一列或多列可能必须是唯一的(唯一的:为该索引返回数据库中只有一行,或者非唯一:可以返回多行) 。表的主键是唯一索引,通常只有一列。

外键是表中引用另一个表中唯一索引的值。它用作将表格关联在一起的一种方式。例如,子表可以通过其父列中唯一索引的列查找父父行。

答案 3 :(得分:3)

问题:您能解释一下这个场景中的索引是什么吗?它与外键有什么不同以及它对我的数据库设计有何影响?

在这种情况下,您的外键是Posts_Tags表中的两列。使用外键时,每个外键列必须包含它引用的主表中的值。在这种情况下,帖子和标签表。

Posts_Tags-> PostID必须是帖子中包含的值 - > PostID

Posts_Tags-> TagID必须是Tags-> TagID

中包含的值

将索引视为一个已经提高了查询/搜索值的速度和效率的列,代价是增加了数据库的大小。通常,主键是索引,其他列需要在您的网站上查询/搜索,在您的情况下,可能是帖子的名称(帖子> PostName)

在您的情况下,索引对您的设计影响很小(它们对速度和效率很有帮助),但是您的外键对于避免数据损坏非常重要(其中的值与帖子不匹配)和/或标记)。

答案 4 :(得分:2)

您描述了一个非常常见的数据库构造;它被称为“多对多关系”。

索引根本不应影响此架构。实际上,索引不应该影响任何架构。索引是空间和时间之间的权衡:索引指定您愿意使用额外的存储空间,以换取通过数据库的更快搜索。

维基百科有一篇关于数据库索引是什么的优秀文章:Index (database)

答案 5 :(得分:1)

要在mysql中使用外键,需要在两个表上创建索引。例如,如果您希望表a_id上的字段b引用表id上的a字段,则必须在a.id上创建索引和b.a_id之前可以创建参考。

更新:您可以在此处详细了解:http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html