0

这个问题实际上可以应用于任何语言。它与相似,但不完全相同。

我有一个网站应用程序,它将显示数据库中的数据。三个数据库表:

tblProfessor(Id,FirstName,LastName)
tblStudent(Id,FirstName,LastName)
tblProfessorStudent(Id,StudentId,ProfessorId)

所以我们有学生和教授。学生可以由多个教授教授,教授可以教授多个学生。

查询数据的两种方式:

  1. 返回所有三个表的连接,在这种情况下,我们传输一些重复数据。
  2. 为每个表返回三组。我知道可以从我的 Web 应用程序一次调用中返回多组数据。我不清楚该调用的机制,但我认为它只是与数据库的一个连接(与上面提到的类似问题相反)。

第一种情况下的查询:

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

我应该如何从性能角度为我的应用程序查询数据?

4

3 回答 3

1

从纯粹的性能角度来看,没有什么比 SQL Server 在 T-SQL 中连接数据集的能力更好的了。尤其是当我们谈论大型数据集时。
它在生活中的唯一目的是管理数据和数据集,并且它在数据源所在的地方执行此操作。
在客户端上“通过网络”连接将引入大量(网络)开销、冗余数据流量,并且花哨的客户端算法没有或几乎没有办法克服这一点。

当然,和往常一样:YMMV,“这取决于”总是适用于我的陈述。

于 2012-05-18T08:09:36.153 回答
0

我认为在这种情况下最重要的是您如何使用数据。如果您实现了正确的索引,SQL Server 将很好地连接表,不用担心。我很确定它会比运行 3 次选择更快。你说你担心重复数据,但是什么样的重复呢?如果您加入这 3 个表,您将获得真实数据,我的意思是,教授 X 个学生的老师和由 X 个老师教授的学生。没有重复!同样,这取决于您如何使用结果集。您是否只是显示学生列表和教师列表?在这种情况下,请使用选项 2。如果您需要显示教师 A 有以下学生,请使用选项 1 的连接,因为如果您选择选项 2,

于 2012-05-18T08:23:41.423 回答
0

如果您担心性能,则不应返回表中的所有行。一旦数据库增长,这将导致应用程序变慢。您应该过滤数据以仅获取需要向用户显示的行。也可以考虑实现分页,这样就不会一次显示很多行。

于 2012-05-18T08:19:28.870 回答