2013-10-06 61 views
0

我正在规范我的数据库结构,但我不完全确定要应用哪些索引。我有以下结构:适用于规范化SQL数据库的索引是什么?

我的个人档案表有2列(profile_id,profile_name),我的关键字表有2列(keyword_id,keyword_name),我的profiles_keyword表有2列(profile_id,keyword_id)。

将索引应用于所有列是否合理?我应该在profile_id,keyword_id上制作PRIMARY COMPOSITE键吗?我还应该将参照键添加到profiles_keyword表中?

不知道哪个是最好的,哪些关键doens与另一个工作!

谢谢。

+0

针对您针对您的数据运行的查询使用执行计划。它会告诉你索引何时丢失。除PK和FK之外,您需要的索引取决于您如何查询数据。 –

+0

请注意,主键可以使记录具有唯一性,使您能够识别它。请记住您关于复合主键的决定。话虽如此,就你所描述的看来,这似乎是正确的路要走。 –

回答

0

在profiles_keyword上,您应该为每个表添加2个外键。

为每个添加FK的列添加索引是一种很好的做法,因此需要2个索引。

根据您的疑问,您应该决定是否同时为2列添加索引。

如果按名称从Profiles表或从keyword表你可以和在Name列的索引做选择,但你必须考虑到对字符串字段索引会在磁盘上更多的空间。

对于所有索引,请记住,因为数据库需要更新索引,所以您在执行插入和更新时付出代价。

0

由于它们是主键,因此profile_id和keyword_id都会自动建立索引,以便优化联接。只需要关系表上的复合主键以确保对的唯一性,如果这不是约束条件,即相同的配置文件可以使用相同的关键字多次关联,则不需要该索引。但是,您可以创建一个非唯一索引来优化连接性能。无论如何将是很好的指定外键来正确管理实体完整性之间的关系。

+0

数据库引擎没有提及,但有没有不会自动索引主键? –

+0

@DanBracuk你是对的我编辑了我的答案 – remigio

1

这里有两个相关但概念上相互分离的概念。

首先,有钥匙的概念 - 主要和外国。这些是概念实体,用于确定表格及其关系的性质。例如,一个主键说“这是你如何唯一标识这个表中的另一行”。原则上,“钥匙”本身不具备实体存在。

密钥通常使用索引实现 - 例如,主键需要唯一索引。我建议您将索引应用于主键和外键。

索引是一个物理的东西 - 它存在于您的硬盘上。您使用索引有两个原因:为您的密钥提供物理形状(请参阅上文),并优化查询。例如,尽管“profile_name”和“keyword_name”不是模式中的关键字,但很可能它们将用于搜索。因此,您可能需要在这些列上使用索引。

+0

PK索引不仅是唯一的,它也是* clustered * :) –

+0

并不总是 - 不是每个数据库引擎都支持聚集索引。当然,如果你的数据库支持它,为主键使用聚集唯一索引几乎​​总是一个好主意。 –