我的组织使用Hibernate处理Spring MVC。我们总是在映射文件中指定外键约束,例如Person.hbm.xml
<set name="ContactList">
<key column="PersonId" foreign-key="Fk_Peson_Contact"/>
<one-to-many class="Sample.Model.Contact"/>
</set>
此映射将在Person
和Contact
之间创建一对多关系,并将PersonID
保留为Contact
表中的外键列。
但是,现在组织决定不提及映射文件中的任何关系,意味着上述情况Person
映射不会有任何类型的一对多映射而不是Contact
映射将具有属性<property name="FK_PersonID"/>
,该属性将创建保留personID
的列。在此方案中,表Person
和Contact
看起来相同,但不同之处在于它们与Person
和Contact
之间没有关系,因为没有指定映射。
在这种情况下,如果我们想要获取人的联系人列表,那么我们必须触发两个查询,以获取另一个人的联系人列表。假设我们想要使用其contactList获取personList,然后我们必须在PersonList上For loop
并获取它将触发查询数量的ContactList。
当我问为什么不指定关系时,大四说,
如果外键在DB中,那么我们就不能进行切片和分区。
当我们触发连接查询时,DB需要更多时间来执行它。这可能会减慢数据库服务器的速度。
但是,我的问题是 -
如果我在personList上执行For looping
那么它会触发查询次数以获取联系人吗?
这样的循环可以减慢应用程序或应用程序服务器的速度吗?
如果我想用conatctList,AddressList,QualificationList获取personList,会导致n + 1问题吗?
无论是否指定映射,哪种方案更有用。
答案 0 :(得分:0)
好吧,我是微软公司(MS)SQL分区的早期演示之一,他们展示了一个从分区表中选择的查询,其中数据填充了多个部分,并且它使用其索引和统计信息甚至不打扰访问分区没有(相关)数据。当然如果你没有fk constaint那么它就不能使用索引和统计来知道fk conforms。我很确定Kalen Delaney会在她的书中介绍它(对于MSSQL的相关版本)。关键是统计数据将包含必要的信息以防止不必要的搜查。该演示实际上使用了一个联合来轻松演示效果。