这个问题实际上可以应用于任何语言。 它类似于this one,但不完全相同。
我有一个网站应用程序,它将显示数据库中的数据。 三个DB表:
tblProfessor(Id,FirstName,LastName)
tblStudent(Id,FirstName,LastName)
tblProfessorStudent(Id,StudentId,ProfessorId)
所以我们有学生和教授。学生可以由多位教授授课,教授可以教授多名学生。
两种查询数据的方式:
第一种情况下的查询:
select
ProfessoirId = p.Id
,ProfessorFirstName = p.FirstName
,ProfessorLastName = p.LastName
,StudentId = s.Id
,StudentFirstName = s.FirstName
,StudentLastName = s.LastName
from tblProfessorStudent ps
inner join tblProfessor p
on p.id = ps.ProfessorId
inner join tblStudent s
on s.id = ps.StudentId
我所说的重复是每行返回学生和教授的名字和姓氏 - “学生由教授教授”和“教授教学生”的组合。复制会导致需要从DB传输到应用程序的额外kb数量。
第二种情况下的查询将如此简单:
select <columns> from tblProfessor
select <columns> from tblStudent
select <columns> from tblProfessorStudent
如何从性能角度查询我的应用的数据?
答案 0 :(得分:1)
从纯粹的性能角度来看,没有什么比SQL Server在T-SQL中加入数据集的能力更好了。特别是当我们谈论大数据集时 它的唯一目的是管理数据和数据集,并在数据来源的地方进行管理 在客户端加入“无线”/将会引入大量(网络)开销,冗余数据流量,并且没有或几乎没有办法让花哨的客户端算法能够克服这个问题。
当然,和往常一样:YMMV,“它取决于”总是适用于我的陈述。
答案 1 :(得分:0)
如果您担心性能,则不应返回表中的所有行。一旦数据库增长,这将导致应用程序变慢。您应该过滤数据以仅获取需要向用户显示的行。您还可以考虑实现分页,这样就不会一次显示很多行。
答案 2 :(得分:0)
我认为在这种情况下最重要的是你如何使用数据。如果您实现了正确的索引,SQL Server将很好地加入表,不用担心。我很确定它会比运行3次选择更快。你说你担心重复的数据,但是什么样的重复?如果您加入3个表,您将获得真实数据,我的意思是,教X学生和X教师教授的学生。没有重复!所以,这又取决于你如何使用结果集。您只是显示学生名单和教师名单吗?在这种情况下,请使用选项2.如果您需要显示教师A有以下学生,那么选择加入选项1,因为如果您选择选项2,您将必须操纵ProfessorStudent数据集(我假设只有ID)从其他2个数据集中获取名称,这在我看来太麻烦了。