2

我正在尝试添加到我们有 tblUsers 表的现有数据库中。截至目前,我们将用户图像存储在文件系统中,现在我们通过将用户图像存储在数据库中的新 tblUserImages 表中来摆脱这种情况。

这是两张表的样子。

表结构

我想添加一个约束,每个用户只允许一张活动图片,但我不知道该怎么做。我试过查找它无济于事。任何帮助是极大的赞赏!关于 SQL Server,我还有很多东西要学习。

4

3 回答 3

6

如果您使用的是 SQL Server 2008,则可以创建过滤的唯一索引,如下所示:

create unique index uniqueUserActiveImages 
    ON tblUserImage(UserID, Active) 
WHERE Active = 1;

这允许用户拥有多个非活动图像但只有一个活动图像。

于 2013-07-13T01:44:21.387 回答
1

我建议您考虑为非活动图像使用单独的实体(单独的表)。这样您就不需要 tblUserImages 中的“活动”属性,此表中的所有图像都将处于活动状态。如果您想查询图像历史记录,您只会引用非活动图像表。活动图像表对 UserId 具有唯一约束,或者它可以简单地使用 UserId 作为主键。

这可能听起来像是一个深奥的解决方案,但它是基于在其他系统中看到同样的数据建模问题的经验。核心问题是:系统的活动状态与系统的历史状态不一样。代表活动状态的一部分的实体与记录历史状态的实体不同,即使两个实体中的信息重叠。如果您使用这个想法来发展您的数据模型,您应该会看到事实上历史实体的属性确实倾向于与其活跃的“操作”对应物有所不同。换句话说,您可能会发现活动图像表的字段布局可能与历史图像表的理想字段布局并不完全相同。

我可以看到以这种方式构建数据的唯一缺点是必须在替换活动图像时将其复制到历史表中。在几个重要方面,这个解决方案是优越的 - 查询会更快,特别是如果您使用集群键作为用户 ID。最重要的是,其他编码人员更容易理解该解决方案。创建过滤索引是一个完整的解决方案,也是对 SQL Server 功能的很好利用,但对于未来的维护程序员来说可能并不那么清楚。

于 2013-07-13T02:21:07.577 回答
0

我从来都不喜欢触发器,但在这种情况下,我认为它可以帮助您完成任务。

建议在插入或更新时编写一个触发器来检查是否有任何其他活动图像与用户相关联。如果有,您可以抛出自定义错误,或将所有其他图像设置为非活动状态。

于 2013-07-13T01:45:13.070 回答