我正在尝试添加到我们有tblUsers表的现有数据库。到目前为止,我们将用户图像存储在文件系统中,现在我们正在通过将用户图像存储在新的tblUserImages表中的数据库中而远离它。
这是两张表的样子。
我想添加一个约束,每个用户只允许一个活动图片,但我不知道如何做到这一点。我试过看起来无济于事。任何帮助是极大的赞赏!我还有很多东西要学习SQL Server。
答案 0 :(得分:6)
如果您使用的是SQL Server 2008,则可以创建过滤的唯一索引,如下所示:
create unique index uniqueUserActiveImages
ON tblUserImage(UserID, Active)
WHERE Active = 1;
这允许用户拥有多个非活动图像,但只有一个活动图像。
答案 1 :(得分:1)
我建议您考虑为非活动图像设置单独的实体(单独的表)。这样,您不需要tblUserImages中的“活动”属性,此表中的所有图像都将处于活动状态。如果要查询图像历史记录,则只能引用非活动图像表。活动图像表要么对UserId有唯一约束,要么只能使用UserId作为主键。
这可能听起来像是一个深奥的解决方案,但它基于在其他系统中看到同样的数据建模问题的经验。核心问题是:系统的活动状态与系统的历史状态不同。表示活动状态的一部分的实体与记录历史状态的实体不同,即使两个实体中的信息重叠也是如此。如果您使用这个想法改进数据模型,您应该看到,实际上历史实体的属性确实倾向于与其活跃的“操作”对应物不同。换句话说,您可能会发现活动图像表的字段布局可能与历史图像表的理想字段布局不完全相同。
我在以这种方式构造数据时可以看到的唯一缺点是必须将活动图像复制到历史表中。在几个重要方面,此解决方案更优越 - 查询将更快,尤其是如果您使用群集密钥用于用户ID。最重要的是,解决方案对其他编码人员来说更容易理解。创建过滤器索引是一个完整的解决方案,并且很好地利用了SQL Server功能,但未来的维护程序员可能不太清楚。
答案 2 :(得分:0)
我从不喜欢触发器,但在这种情况下,我认为它可以帮助您完成任务。
建议编写触发器以检查插入或更新,以查看是否存在与用户关联的任何其他活动图像。如果有,您可以抛出自定义错误,也可以将所有其他图像设置为无效。