2016-07-11 7 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) 
) 

Iは、そのスケールは1、2、4、または6であり、GraphPositionが< =スケールであることを確実に制約があります。

私がしたいことは、各テンプレート(TemplateName/UserNameのペア)の値に対して、すべての行がスケールの値が同じであることを確認することです。私はそれをどうやってやるのだろうと思っています。

+2

「各プライマリキーの値、すべての行...」とはどういう意味ですか?各PKには、テーブル内に正確に1つの行があります。 –

+0

申し訳ありませんが、あなたは正しいです。私はそれぞれ固有のペアTemplateName/UserNameを意味し、スケールを同じにしたい。 – Russ

+0

私は明確にするために質問を編集しました。 – Russ

答えて

1

TemplateName, UserNameを共有するすべての行も同じScaleを持つようにしますか?

これは、スケールが機能的に2つの列に依存するため、デザインが正規化されていないことを意味します。だから、これを正規化するには、TemplateName, UserNameのPKを持つ別のテーブルを使用して、それぞれについて1行(および希望のスケールの列)を確保し、この事実を1回だけ保存するようにします。

しかし、既存の構造を使用すると、インデックス付きのビューを使用してこの制約を適用することができます。

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

はい、あなたは正しいです、実際には2つのテーブル、1つはテンプレート用、もう1つは個々のグラフデータ用です。現在のリリースでは、グラフごとにテンプレートがあり、複数のグラフを扱うテンプレートを持つように拡張しています。おそらく、弾丸を噛んで正規化するべきでしょう。レスポンスありがとう! – Russ

+0

@Russしかし、あなたは、インデックス化されたビューを再度必要とする 'GraphPosition is

関連する問題