2016-07-11 2 views
1

보고서 템플릿을 저장하기위한 테이블이 있습니다. 보고서는 1, 2, 4 또는 6 개의 다른 그래프로 구성됩니다 (눈금). 각 그래프마다 별도의 행이 있으며 각 행에는 보고서의 그래프 수가 포함됩니다.기본 키당 고유 한 열 값

CREATE TABLE ReportTemplate (
    TemplateName varchar(100) not null, 
    UserName varchar(100) not null, 
    GraphPosition int not null, 
    Scale int not null, 
    -- graph specific stuff here 
Constraint PK_ReportTemplate primary key clustered 
    (TemplateName ASC, UserName ASC, GraphPosition ASC) 
) 

는 그 규모는 1, 2, 4 또는 6이고 GraphPosition가 = 스케일 < 것을 보장 제약이있다.

내가 원하는 것은 각 템플릿 (TemplateName/UserName 쌍) 값에 대해 모든 행의 배율이 동일한 지 확인하는 것입니다. 내가 어떻게 할 수 있는지 궁금 하네.

+2

'각 기본 키 값, 모든 행에 대해 ...'이 무슨 뜻입니까? 각 PK에 대해 테이블에 정확히 하나의 행이 있습니다. –

+0

죄송합니다, 정확합니다. 나는 각 고유 한 쌍인 TemplateName/UserName을 의미 했으므로 Scale을 같게하려고합니다. – Russ

+0

나는 명확하게하기 위해 질문을 편집했다. – Russ

답변

1

TemplateName, UserName을 공유하는 모든 행도 동일한 Scale을 가지려고합니까?

이것은 스케일이 두 열에 기능적으로 종속되어 있기 때문에 디자인이 표준화되지 않았 음을 의미합니다. 따라서이를 정규화하려면 TemplateName, UserName의 PK가있는 다른 테이블을 사용하여 각각에 대한 단일 행 (및 원하는 축척에 대한 열)을 확보하여 한 번만이 사실을 저장하십시오.

그러나 기존 구조를 사용하면 인덱싱 된 뷰를 사용하여이 제약 조건을 적용 할 수 있습니다.

CREATE VIEW SomeView 
WITH SCHEMABINDING 
AS 
SELECT TemplateName, 
     UserName, 
     Scale, 
     COUNT_BIG(*) AS C 
FROM dbo.YourTable 
GROUP BY TemplateName, UserName, Scale 

GO 

CREATE UNIQUE CLUSTERED INDEX IX ON SomeView(TemplateName, UserName) 
+0

네, 맞습니다. 정말 두 테이블이 필요합니다. 하나는 템플릿 용이고 다른 하나는 개별 그래프 데이터 용입니다. 현재 릴리스에는 그래프 당 템플릿이 있으며 다중 그래프를 처리하는 템플릿을 포함하도록 확장 중입니다. 아마도 우리는 총알을 물고 정상화해야합니다. 응답 주셔서 감사합니다! – Russ

+0

@Russ 그렇지만, 'GraphPosition is