0

私の組織は、Hibernate を使用して Spring MVC に取り組んでいます。person や contactList のように、常にマッピング ファイルで外部キー制約を指定します。Person.hbm.xml

<set name="ContactList">
  <key column="PersonId" foreign-key="Fk_Peson_Contact"/>
  <one-to-many class="Sample.Model.Contact"/>
</set>

Personこのマッピングにより、 と の間に1 対多の関係が作成され、テーブルの外部キー列としてContact保持されます。PersonIDContact

しかし、現在、組織はマッピング ファイルでいかなる種類の関係についても言及しないことを決定しました。つまり、上記の場合、マッピングには、保持する列を作成するプロパティが含まれるPerson代わりに、1 対多のマッピングは一切含まれません。このシナリオの表では、 と は同じように見えますが、違いは と の間に関係がなく、マッピングが指定されていないことです。Contact<property name="FK_PersonID"/>personIDPersonContactPersonContact

そのような場合、人の contactList を取得したい場合は、2 つのクエリを起動して、1 つはその contactList の別の人物を取得する必要があります。personList とその contactList を取得したい場合、For loopPersonList を取得し、その ContactList を取得する必要があります。これにより、多数のクエリが起動されます。

関係を特定しない理由を尋ねると、先輩はこう言いました。

  • 外部キーが DB にある場合、スライシングとパーティショニングは実行できません。

  • 結合クエリ DB を起動すると、DB の実行に時間がかかります。これにより、DB サーバーが遅くなる可能性があります。

しかし、私の質問は -

  • For loopingpersonList で行うと、連絡先を取得するために多数のクエリが実行されますが、それは実行可能ですか?

  • このようなループは、アプリケーションまたはアプリケーション サーバーの速度を低下させる可能性がありますか?

  • conatctList、AddressList、QualificationList を使用して personList を取得したい場合はどうすればよいですか? これにより n+1 の問題が発生しますか?

マッピングを指定するかどうかにかかわらず、どちらのシナリオがより有益であるか。

4

1 に答える 1

0

マイクロソフトによる (MS) SQL のパーティショニングの初期のデモの 1 つで、複数のパーティションにまたがってデータが入力されたパーティショニングされたテーブルから選択されたクエリを示しました。 (関連する) データ。もちろん、fk constaint がない場合、インデックスと統計を使用して fk が準拠していることを知ることはできません。Kalen Delaney の著書 (関連するバージョンの MSSQL について) でカバーされていると確信しています。重要なのは、不要なシークを防ぐために必要な情報が統計に含まれていることです。デモでは実際にユニオンを使用して効果を簡単にデモしました。

于 2013-03-27T09:00:37.727 に答える