2009-04-14 12 views
-1

私はアンケートのドメインと回答を取るSMSベースの調査アプリケーションを持っています。SQL Server 2005でこの制約を処理する最善の方法は何ですか?

私は、詳細なDDLの要求を得ているので....データベースはthis

SurveyAnswer.AnswerはそのSurveyDomainのためのすべてのアクティブ調査内で一意でなければなりませんように見えます。 SQL用語では、これは常に0..1行返す必要があります:私は、アプリケーションレベルでこの制約を扱うことを計画

select * from survey s, surveyanswer sa 
where s.surveyid = sa.surveyid and 
     s.active = 1 and 
     s.surveydomainid = @surveydomainid 
     sa.answer = @answer 

をするだけでなく、いくつかのデータベースの整合性のように強制されるようになります。これを行う最善の方法は何ですか?引き金?制約がありますか?

+0

DDLを提供できますか?あなたの主キーは何ですか? –

+0

DDLを私ができる最も簡単な方法で追加しました: – TheSoftwareJedi

答えて

2

2つのテーブルをカバーしているので、AFAIKはこれを強制する2つの方法しかありません。

  1. 推奨するとおりにトリガーします。
  2. 3つの列に一意の制約があるインデックス付きのビュー。

信頼性に関する限り、私はIndexedビューを使用しますが、唯一の欠点は、第三者が理解しにくいことです。

0

ストアド・プロシージャを使用してDML操作を実行すると仮定すると、SPにガード句を追加して、アンサーに回答を追加して同等の回答が存在するかどうかを確認できます。次に、例外をスローするか、応答を追加できないことを示すステータスコードを返すことができます。

alter table MyTable add constraint complexConstraint 
check (dbo.complexConstraintFct()=0) 

がcomplexConstraintFctが他のテーブルでクエリを含む関数のようになります。

1

このようにUDFで実装されている制約を追加することが可能です。しかし、チェック・制約は一度に1行で評価されるように設計されていますが、更新は一度に1行以上に影響を与える可能性があるため、このアプローチにはいくつかの問題があります。

したがって、最終行はトリガー付きです。

0

あなたが行レベル(例えばCHECK制約)でそれを行うことはできませんので、あなたはすべての行

トリガが「素敵な」メッセージを送信することができますを見ることができる何かを持っている必要がありますが、彼らはDMLステートメントの後に実行。処理を細かく制御できます。

インデックス付きビューはDMLステートメントを防止しますが、技術的なエラーメッセージが表示されます。維持するのは余分なオブジェクトとインデックスです。

-1

アクティブな質問では、タプル(surveyDomain、surveyQuestion、surveyAnswer)はユニークでなければならないと思いますか?

つまり、survey:surveyanswerが1:manyに設定されているにもかかわらず、survey:survey answerが1:1になっています。

もしそうなら、答えはあなたのテーブル構造を変更することです。サーベイするnull可能なactiveAnswerId列を追加すると、効果的に関係が1:1になります。既存の制約独自のSurveyId(または独自のSurveyId、SurvetDomainId)で一意性を強制するのに十分です。

私が誤解していない限り、Surveyに質問欄があることに驚いています。アンケート:質問が複数のアンケートに表示される場合は、1:多くの質問(アンケートには多くの質問があります)または多くの質問:1つになることをお勧めします。

もっと一般的には、制約を強制する方法を理解するのは難しく、トリガーやユーザー定義関数などの "ヒーローズ"が必要な理由は、問題のドメインを正確にモデル化していないスキーマの症状です。

OPのコメント:

いいえ、あなたはそれを逃しています。調査:答えは1:nです。 「質問」である調査の質問 - タプルは(SurveyDomain.SurveyDomainId、Survey.Answer)

あなたはすべてのドメインに対して、最大1つの答えでありますことを意味だろうか?この場合も、スキーマを見れば、最高の誤解を招きます。 SurveyDomainには多くのアンケートがあり(それぞれに質問欄があります)、アンケートには多くのアンサーがありますか? (Schema

しかし、アンケートのアクティブビットが設定されている場合は、回答は1つのみですか?

アンケートには疑問がありますか?

あなたがモデル化しようとしていることは本当に明確ではありません。

また、制約を追加するのが難しい場合は、モデルが機能しないことが示唆されます。

+0

いいえ、あなたはそれを見逃しています。調査:答えは1:nです。 "Question"はアンケートの質問です。 – TheSoftwareJedi

+0

タプルは(SurveyDomain.SurveyDomainId、Survey.Answer) – TheSoftwareJedi

+0

です。 "質問"の欄は無視してください。 [質問]列は、単に調査の「質問」テキストにすぎません!アンケートにはN個の回答があります! – TheSoftwareJedi

関連する問題