我正在使用 NHibernate 加载不同类型的对象的大树。映射是使用 table-per-subclass 策略实现的。我定义了一个基类“Node”,它只有几个字段(NodeId、ParentId、NodeType)和几个从 Node 继承并添加自己的字段的子类。
这种方法的实现很简单,我不能抱怨性能。一棵由 10 000 个不同类型对象组成的大树在几百毫秒内使用单次往返填充到我的旧机器上。然而,有一件事情让我担心:这种策略会导致生成一个复杂的查询,其中节点表与对应于已定义子类的所有其他表进行外部连接。虽然当不同子类的数量很少时这很好,但如果数量增加,OUTER JOIN 复杂度也会增加。
为每个类定义表似乎不是一个优雅的选择,当从基类中选择数据时它会运行缓慢(因为 UNION)。其他选项似乎增加了到数据库服务器的往返次数。
那么,当填充由不同类型的实体组成的大树时,您认为最佳实践是什么?有什么比每个子类的表更好的吗?