2012-12-08 2 views
2

아래 두 테이블을 가지고있을 때 StatusTypes 테이블이 과포로 간주 될 수 있습니까? 즉, 그것을 사용하는 것보다 더 많은 이점이 있습니까?SQL Server 외래 키 테이블이 너무 많습니까?

이 상황에서 추가 또는 변경/삭제하기 위해이 상태를 관리자 백엔드에로드 할 필요는 없지만 외래 키를 사용하지 않는 것이 좋지는 않습니다.

상태 유형을 분리하거나 감사 테이블에 보관하는 이유를 찾고 있습니다.

도움을 주시면 감사하겠습니다.

-- i.e. NEW, SUBMITTED, UPDATED 
    CREATE TABLE [dbo].[StatusTypes](
     [ID] [int] IDENTITY(1,1) NOT NULL, 
     [Name] [nvarchar](250) NOT NULL, 
     CONSTRAINT [PK_StatusTypes] PRIMARY KEY CLUSTERED ([ID] ASC) 
    ) ON [PRIMARY] 
    GO 

    CREATE TABLE [dbo].[Audits](
     [ID] [int] IDENTITY(1,1) NOT NULL, 
     [Description] [nvarchar](500) NULL, 
     [Country_Fkey] [int] NOT NULL, 
     [User_Fkey] [int] NOT NULL, 
     [CreatedDate] [date] NOT NULL, 
     [LastAmendedDate] [date] NULL, 
     [Status_Fkey] [int] NOT NULL, 
     CONSTRAINT [PK_Audits] PRIMARY KEY CLUSTERED ([ID] ASC) 
    ) ON [PRIMARY] 
    GO 
+1

데이터베이스에서 참조 무결성을 적용하는 것은 ** 제대로 작동하고 사용자에게 가치를 제공하기 위해 ** 절대적으로 중요합니다 **. 따라서 외래 키 (및 가능한 값)를 적용하는 조회 테이블이 ** 너무 많습니다 ** - 데이터베이스에 너무 많은 안전 예방책을 사용할 수는 없습니다. 단지 너무 적습니다 ... –

+0

이것은 꽤 예뻤습니다. 내가 생각한 것만 큼은 아니지만 어느 방향 으로든 갈 수 있기 때문에 상황에 대한 의견을 좀 나누고 싶었습니다. 감사합니다 – Pricey

답변

1

이 상황에서 상태를 유형 집합 중 하나가되도록 유지하려면 조회 테이블을 유지해야합니다. 일부 데이터베이스는 enum 유형을 가지거나 check constraint를 사용할 수 있지만 이것은 가장 휴대하기 쉬운 방법 인 IMO입니다.

그러나 유형 이름이 포함 된 단일 문자열 열만 포함하는 찾아보기 테이블을 만듭니다. 그렇게하면 실제로 조회 테이블에 가입 할 필요가 없으며 ORM (사용자가 사용한다고 가정)을 완전히 인식하지 못할 수 있습니다. 것

CREATE TABLE [dbo].[StatusTypes](
    [ID] [nvarchar](250) NOT NULL, 
    CONSTRAINT [PK_StatusTypes] PRIMARY KEY CLUSTERED ([ID] ASC) 
) ON [PRIMARY] 
GO 

CREATE TABLE [dbo].[Audits](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    ... 
    [Status] [nvarchar](250) NOT NULL, 
    CONSTRAINT [PK_Audits] PRIMARY KEY CLUSTERED ([ID] ASC), 
    CONSTRAINT [FK_Audit_Status] FOREIGN KEY (Status) REFERENCES StatusTypes(ID) 
) ON [PRIMARY] 
GO 

그리고 특정 유형의 감사 항목에 대한 쿼리 :

이 경우 스키마의 모습

그래서 참조 무결성이 여전히 적용되지만 쿼리됩니다
SELECT ... 
FROM Audits 
WHERE Status = 'ACTIVE' 

돈 ' 추가 조인이 필요합니다.

+0

그래서'StatusTypes' 테이블을 유지하고 StatusType에 대한 외래 키가 아닌 텍스트를'Audits' 테이블에 저장하겠습니까? – Pricey

+0

내 대답에 예제를 추가했습니다. 내보기는 유효한 문자열 집합 중 하나를 열을 제한 할 때 불필요한 숫자 ID가없는 것입니다. – djb

+0

아, 알 겠어, 재미있는 개념의 외래 키 제약 조건을 사용하고 내 시스템에서 열거 형을 사용할 것이라고 말한 것처럼 이것은 하나의 결합이 적다는 것을 의미한다. 나쁜 것도 아닙니다. – Pricey

0

나는 논쟁을 제안합니다 : 가장 유용한 곳에 개발 시간을 사용하십시오. 어쩌면이 런 타임 검사가 그렇게 많이 필요하지 않을 수도 있습니다. 어쩌면 당신은 더 유용한 다른 수표를 위해 당신의 개발 시간을 사용할 수 있습니다.

유효하지 않은 상태 값이 설정 될 가능성이 있습니까? 응용 프로그램은 반드시 상수 또는 열거 형 집합을 사용하므로 일부 불량 값이 입력되지 않을 수 있습니다.

즉, 무결성 보장에 많은 가치가 있습니다. 나는 모든 "열거 형"열을 BETWEEN 점검 제한 조건으로 처리하는 것을 좋아합니다.이 제한 조건은 런타임에 신속하게 수행되고 더 빠르게 수행됩니다.