我开始从事一个与 SO 非常相似的项目。我为我的应用程序创建了一个数据库(Code First EF-5 Sql server 2012),其中有很多表,包括Questions ans Answers。这两个表之间存在一对多的关系(一个问题可以有多个答案)。现在我也想在问题列表视图中显示每个问题的答案计数。
显而易见的方法是(如果 Answers 和 Questions 有一对多的关系,所以每个问题实体都有一个 List of Answers 对象)所以我们可以写一个简单的语句:
question.Answers.Count;
但是我对这个查询有性能疑问。首先我告诉我我是如何决定这样做的(我对数据库没有太多经验,所以如果我走错了路,请纠正我)
我在问题表名称中创建了一个额外的列,AnswerCount
每次用户插入或删除问题的答案时都会更新该列。为此,我编写了一个 sql 触发器,在 Answer 表上的插入或删除事件上执行。这是触发器:
Create TRIGGER [dbo].[trg_Answer_INSERT_Delete]
ON [dbo].[Answer]
AFTER INSERT, DELETE
AS BEGIN
DECLARE @id as int = 0,
@count as int = 0;
SELECT TOP 1 @id = QuestionId FROM inserted;
IF @id = 0
BEGIN
SELECT TOP 1 @id = QuestionId FROM deleted;
END
SELECT @count = count(*) FROM Answer where QuestionId = @id;
UPDATE Question
SET AnswerCount = @count
WHERE Id = @id;
END
我正在做所有这些开销,因为将计数保存在列中并且只在想要显示计数时访问列值而不是每次我们想要显示时都在导航属性(答案)上调用计数函数时效率不高这个问题的答案很重要??
有人可以详细说明这种情况吗?