在1:M关系上实施数据驱动的1:1约束

时间:2011-04-25 19:21:29

标签: sql-server tsql database-design

使用SQL Server 2K8 R2,我有两个相关的表 - 成员和问卷调查表。每个表都有一个名为ID的BigInt PK。调查问卷有会员ID,以便与正在填写表格的成员联系。 随着时间的推移,会员可以多次填写调查问卷。业务要求是每个成员每年完成一次最多的调查问卷。使用简单的CHECK CONSTRAINT无法解决AFAIK。

有“干净”的方法吗?我希望避免做类似以下的事情:

CREATE TRIGGER tr_Questionnaire_Insert
  ON Questionnaire
  INSTEAD OF INSERT
AS BEGIN
  -- Check for a violation of once questionnaire per calendar year and if found, call RAISERROR

  -- Otherwise continue with INSERT
END;

我不想使用这种方法的原因主要是因为它要求我(或者长期维持这个解决方案的任何人)记住如果调查问卷的架构应该改变,就要保持触发。

1 个答案:

答案 0 :(得分:6)

只需在问卷表上创建一个包含MemberId和year的唯一索引。