gpt4 book ai didi

c# - SQL 数据库中一对多关系的性能问题

转载 作者:太空宇宙 更新时间:2023-11-03 16:14:07 25 4
gpt4 key购买 nike

我开始从事与 SO 非常相似的项目。我为我的应用程序创建了一个数据库(Code First EF - 5 Sql server 2012),其中有很多表,包括问题答案。这两个表之间存在一对多关系(一个问题可以有多个答案)。现在,我也想在问题 ListView 中显示每个问题的答案 计数。

很明显的方法是(如果 Answers 和 Questions 有一对多的关系,所以每个问题实体都有一个答案列表对象)所以我们可以写一个简单的语句:

   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

我做所有这些开销是因为将计数保存在列中并在想要显示计数时只访问列值而不是在导航属性上调用 Count 函数效率不高 (Answers) 每次我们想要显示问题的答案时??

任何人都可以详细说明这种情况吗?

最佳答案

看起来您已决定对数据库进行非规范化以期提高性能。你知道这会提高性能吗?你做过任何分析吗?如果不是,我会先规范化,然后再考虑重构架构以仅在您确实遇到性能问题时才存储计数。我不确定 SO 或任何其他网站做了什么,但我想在走这条路之前确定性能提升。也许其他人会知道并给出一个很好的答案。

如果您认为性能会很差,因为您必须为每个问题检索答案集,那么这不是真的。您始终可以将 Linq to Entity 查询编写为返回匿名类型(或包含问题、answerCount 对的实际类型)的查询。

var query = context.questions.GroupJoin(context.answers,
q => q.QuestionId,
a => a.QuestionId,
(q, aGroup) => new
{
Question = q,
AnswerCount = aGroup.Count()
});

上面将返回一个匿名类型,其中包含一个问题和答案计数,但没有具体化答案。如果您愿意,您可以进一步优化它以仅返回匿名类型的问题标题和答案计数。

关于c# - SQL 数据库中一对多关系的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16316941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com