簡體   English   中英

在SQL Server 2005中處理此約束的最佳方法是什么?

[英]What is the best way to handle this constraint in SQL Server 2005?

我有一個基於SMS的調查應用程序,它包含一個調查域和一個答案。

我已經收到了詳細DDL的請求,所以....數據庫看起來像這樣

SurveyAnswer.Answer在該SurveyDomain的所有活動 Survey中必須是唯一的。 用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

我計划在應用程序級別處理此約束,但也希望強制某些數據庫完整性。 做這個的最好方式是什么? 觸發? 可能有約束嗎?

當您覆蓋2個表時,只有AFAIK可以執行2種方法。

  1. 按照您的建議進行觸發。
  2. 3列中具有唯一約束的索引視圖。

就可靠性而言,我會選擇索引的觀點,但是唯一的缺點是第三方將很難理解。

可以添加在UDF中實現的約束,如下所示:

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

其中complexConstraintFct是一個包含對其他表的查詢的函數。 但是,這種方法存在一些問題,因為檢查約束被設計為一次在單個行上進行評估,但是更新一次可以影響多於一行。

因此,最重要的是: 堅持使用觸發器

假設您正在使用存儲過程執行DML操作,則可以在SP中添加一個保護子句,該子句向調查中添加答案以檢查是否存在等效答案。 然后,您可以引發異常或返回狀態代碼以指示無法添加答案。

您不能在行級別執行此操作(例如,CHECK約束),因此必須具有可以查看所有行的內容

觸發器可以發送“不錯的”消息,但是它們在DML語句之后運行。 您可以很好地控制處理。

索引視圖可以防止DML語句,但是會給出技術錯誤消息。 這是一個額外的對象要維護的索引

我認為您的意思是,對於任何活動問題,元組(surveyDomain,surveyQuestion,surveyAnswer)必須是唯一的?

換句話說,即使問卷調查處於活動狀態,但問卷調查:調查答案仍為1:1,即使將問卷調查:調查答案設置為1:很多。

如果是這樣,答案是更改您的表結構。 向調查添加可為空的activeAnswerId列將有效地使關系1:1; 您現有的約束唯一的SurveyId(或唯一的SurveyId,SurvetDomainId)足以實施唯一性。

確實,除非我有誤解,否則我對Survey的“問題”列感到驚訝; 如果一個問題可以出現在多個調查中,我希望Survey:Question為1:很多(一個調查有很多問題),甚至很多:很多。

更籠統地說,我懷疑弄清楚如何強制執行約束是困難的,並且需要觸發器或用戶定義的函數之類的“英雄”之類的原因是架構無法對問題域進行准確建模的症狀。

OP評論:

不,您想念它。 調查:答案為1:n。 “問題”是調查問題–元組將是(SurveyDomain.SurveyDomainId,Survey.Answer)

您的意思是,對於每個域,最多只有一個答案? 同樣,查看您的架構,這充其量是一種誤導。 SurveyDomain有很多調查(每個調查都有一個“問題”列),而調查有很多答案? 架構

但是,如果設置了調查的活動位,則應該只有一個答案?

Survey是對問題的誤稱嗎?

確實不清楚您要建模的內容。

同樣,如果很難添加約束,則表明您的模型不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM