![](/img/trans.png)
[英]What is the best way to store historical data in SQL Server 2005/2008?
[英]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種方法。
就可靠性而言,我會選擇索引的觀點,但是唯一的缺點是第三方將很難理解。
可以添加在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.