我对数据库建模中的外键表索引有一般性的疑问。如果我有一个表TABLE_A,则创建为:
CREATE TABLE [dbo].[TABLE_A](
[ID] [int] IDENTITY(1,1) NOT NULL,
[RelatedTableBID] [int] NOT NULL,
CONSTRAINT [PK__TABLE_A] PRIMARY KEY CLUSTERED
(
[ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[TABLE_A] WITH CHECK
ADD CONSTRAINT [TABLE_A__RelatedTableB]
FOREIGN KEY([RelatedTableBID])
REFERENCES [dbo].[TABLE_B] ([ID])
和Table_B为:
CREATE TABLE [dbo].[TABLE_B](
[ID] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK__TABLE_B] PRIMARY KEY CLUSTERED
(
[ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
) ON [PRIMARY]
如果我在引用表(表A)引用列(RelatedTableBID)上创建索引,它实际上会更有效吗?如:
CREATE INDEX TABLE_A_FK_INDEX1 on TABLE_A(RelatedTableBID)
或者我正在考虑倒退?看来,由于被引用的列本身就是一个聚簇索引,因此在连接期间不应该有任何问题 - 如果有的话,只有从TABLE_B中删除的内容似乎容易出现性能不佳。
感谢您帮助我做好准备。
-Mustafa
修改
所以,一般来说,如果我在查询时一直在where子句中加入或使用列,我应该考虑在其上添加索引吗? What are some best practices and "rules of thumb" for creating database indexes?听起来这是一个普遍合理的决定。
答案 0 :(得分:2)
你做得对。无论何时需要加入TABLE_A和TABLE_B,外键上的索引都应该有用。
答案 1 :(得分:0)
没有。你要找的是第三张桌子。如果你想建立一个多对多的关系,那么没有第三张桌子就不可能没有令人作呕的低效数据库设计。
因此: 表'用户':uid,first,middle,last 表'地址':援助,街道,城市,州,国家等 表'users-addresses':id,uid,aid
然后你可以在第三个表中创建多对多的关联。这通常称为数据库规范化。
那么您的查询关联查询将类似于:
SELECT * FROM users,addresses JOIN users-addresses ON users.uid = users-addresses.uid AND addresses.aid = users-addresses.aid WHERE users.uid ='1'或类似的东西
..将为您提供用户'1'的所有用户信息和地址