2016-09-07 2 views
1

나는 SQL Server 데이터베이스에 이러한 스키마를 가지고 : 외래 키를 설정할 때 인덱스를 수동으로 만들어야합니까?

CREATE TABLE [dbo].[Phrase] 
(
    [PhraseId]  UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL, 
    [Text]   NVARCHAR (MAX) NOT NULL, 
    [CategoryId] INT    DEFAULT ((1)) NOT NULL, 

    PRIMARY KEY CLUSTERED ([PhraseId] ASC), 

    CONSTRAINT [FK_PhrasePhraseCategory] 
     FOREIGN KEY ([CategoryId]) 
     REFERENCES [dbo].[PhraseCategory] ([PhraseCategoryShortId]) 
); 

CREATE TABLE [dbo].[PhraseCategory] 
(
    [PhraseCategoryId]  UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL, 
    [PhraseCategoryShortId] INT    IDENTITY (1, 1) NOT NULL, 
    [Name]     VARCHAR (20)  NOT NULL, 

    PRIMARY KEY CLUSTERED ([PhraseCategoryShortId] ASC) 
); 

나는 내가 PhraseCategory 테이블로 이동하여 행을 삭제하려고하면 그 PhraseCategoryShortId가 사용되는 경우가 확인 것이라고 말에 수정 있습니까 구문 표? 그렇다면 해당 테이블에서 CategoryId을 인덱싱해야합니까?

답변

2

예와 예. 이 외래 키는 Phrase에 유효한 PhraseCategory이 있어야하는 제약 조건을 설정합니다. 범주가 삭제되면 PhraseCategory이 삭제되고 Phrase 테이블이 검사되어 "고아"가 Phrase으로 남아 있지 않은지 확인합니다.

외부 키는 항상 (명시 적 제약 조건 또는 기본 키를 통해) 고유 값을 참조해야하지만 필드를 참조하는 필드는 색인 일 필요가 없으므로 색인을 생성해야합니다. PhraseCategory에서 삭제 작업의 성능에 대해주의하십시오.

관련 문제