0

我的组织使用 Hibernate 在 Spring MVC 上工作。我们总是在映射文件中指定外键约束,例如对于 person 和 contactListPerson.hbm.xml

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

Person此映射将在和之间创建一对多关系Contact,并作为外键列保留PersonIDContact表中。

但是,现在组织决定不在映射文件中提及任何类型的关系,这意味着在上述情况下,Person映射将不会有任何类型的一对多映射,而不是这种Contact映射将具有<property name="FK_PersonID"/>创建列来保存的属性personID。在这个场景表中PersonContact看起来相同,但不同之处在于它们之间没有关系PersonContact因为没有指定映射。

在这种情况下,如果我们想获取人员的联系人列表,那么我们必须触发两个查询,一个来获取另一个人的联系人列表。假设我们想用它的contactList来获取personList,那么我们必须For loop在PersonList上获取它的ContactList,这将触发一些查询。

当我问为什么不指定关系时,前辈说,

  • 如果外键在数据库中,那么我们不能进行切片和分区。

  • 当我们触发连接查询时,数据库需要更多时间来执行它。这可能会降低数据库服务器的速度。

但是,我的问题是——

  • 如果我For looping在 personList 上做,那么它会触发一些查询来获取联系人是否可行?

  • 这种循环会减慢应用程序或应用程序服务器的速度吗?

  • 如果我想用它的 conatctList、AddressList、QualificationList 获取 personList 怎么办,这会导致 n+1 问题吗?

指定映射与不指定哪个场景更有利。

4

1 回答 1

0

好吧,我是微软在 (MS) SQL 中进行分区的早期演示之一,他们展示了一个从分区表中选择的查询,该表中的数据填充了多个分区,并且它使用它的索引和统计信息甚至不打扰访问没有分区的分区(相关)数据。当然,如果您没有 fk 约束,那么它不能使用索引和统计信息来知道 fk 符合。我相当肯定 Kalen Delaney 在她的书中(针对 MSSQL 的相关版本)会涵盖它。关键是统计数据将包含必要的信息,以防止不必要的搜索。该演示实际上使用了一个联合来轻松演示效果。

于 2013-03-27T09:00:37.727 回答