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

Yuc*_*uck 0 t-sql sql-server database-design

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

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

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;
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*dge 6

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