0

この質問は実際にはどの言語にも当てはまります。これに似ていますが、まったく同じではありません。

データベースからのデータを表示するWebサイトアプリケーションがあります。3つのDBテーブル:

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

ですから、学生と教授がいます。学生は複数の教授によって教えることができ、教授は複数の学生を教えることができます。

データをクエリする2つの方法:

  1. 3つのテーブルすべての結合を返します。この場合、いくつかの重複データを転送します。
  2. テーブルごとに3セットを返します。Webアプリケーションからの1回の呼び出しで複数のデータセットを返すことができることを知っています。その呼び出しの仕組みについてはよくわかりませんが、DBへの1つの接続にすぎないと思います(上記の同様の質問とは対照的です)。

最初のケースのクエリ:

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が発生します。

2番目のケースのクエリは、次のように単純になります。

select <columns> from tblProfessor
select <columns> from tblStudent
select <columns> from tblProfessorStudent

パフォーマンスの観点から、アプリのデータのクエリにどのようにアプローチする必要がありますか?

4

3 に答える 3

1

純粋なパフォーマンスの観点から、T-SQL でデータ セットを結合する SQL Server の機能に勝るものはありません。特に、大規模なデータ セットについて話している場合はそうです。
その人生における唯一の目的は、データとデータセットを管理することであり、データのソースがある場所でそれを行います。
クライアント上で「ネットワーク経由」で参加すると、大量の (ネットワーク) オーバーヘッドと冗長なデータ トラフィックが発生します。高度なクライアント アルゴリズムでこれを克服できる方法はまったくないか、ほとんどありません。

もちろん、いつものように、YMMV、「場合による」は常に私の声明に当てはまります。

于 2012-05-18T08:09:36.153 に答える
0

パフォーマンスが気になる場合は、テーブルからすべての行を返す必要はありません。データベースが大きくなると、アプリケーションの速度が低下します。ユーザーに表示する必要がある行のみを取得するように、データをフィルタリングする必要があります。一度に多くの行を表示しないように、ページングの実装を検討することもできます。

于 2012-05-18T08:19:28.870 に答える
0

この場合、最も重要なのはデータをどのように使用するかだと思います。正しいインデックスが実装されていれば、SQL Server は問題なくテーブルを結合しますが、心配する必要はありません。3つの選択を実行するよりも高速になると確信しています。データの重複が気になるとおっしゃいましたが、重複とはどのようなものですか?3 つのテーブルを結合すると、実際のデータが得られます。つまり、X 人の生徒を教えている教師と、X 人の教師が教えている生徒です。重複なし!繰り返しますが、結果セットをどのように使用しているかによって異なります。単に学生のリストと教師のリストを表示しているだけですか? この場合、オプション 2 を使用します。教師 A に次の生徒がいると表示する必要がある場合は、オプション 1 に参加します。オプション 2 を選択すると、

于 2012-05-18T08:23:41.423 に答える