Inheritance 使用NHibernate从数据库填充大型树时的表/子类策略
我正在使用NHibernate加载一个由不同类型的对象组成的大型树。映射是使用每个子类的表策略实现的。我定义了一个基类“Node”,它只有几个字段(NodeId、ParentId、NodeType)和几个从Node继承并添加自己字段的子类 这种方法的实现非常简单,我不能抱怨性能。一个包含10000个不同类型对象的大型树在几百毫秒内通过一次往返在我的旧机器上填充。然而,有一件事让我担心:这种策略会导致生成一个复杂的查询,其中节点表与定义的子类对应的每个其他表进行外部连接。当不同子类的数量较少时,这是可以的,但如果数量增加,外部连接的复杂性也会增加 按类定义表似乎不是一个优雅的选项,从基类中选择数据时,它的工作速度会很慢(因为UNION)。其他选项似乎会增加到数据库服务器的往返次数Inheritance 使用NHibernate从数据库填充大型树时的表/子类策略,inheritance,nhibernate,table-per-class,Inheritance,Nhibernate,Table Per Class,我正在使用NHibernate加载一个由不同类型的对象组成的大型树。映射是使用每个子类的表策略实现的。我定义了一个基类“Node”,它只有几个字段(NodeId、ParentId、NodeType)和几个从Node继承并添加自己字段的子类 这种方法的实现非常简单,我不能抱怨性能。一个包含10000个不同类型对象的大型树在几百毫秒内通过一次往返在我的旧机器上填充。然而,有一件事让我担心:这种策略会导致生成一个复杂的查询,其中节点表与定义的子类对应的每个其他表进行外部连接。当不同子类的数量较少时,这
那么,当填充由不同类型的实体组成的大型树时,您认为什么是最佳实践?每个子类有什么比table更好的吗?您在这里处理两个问题:
为了防止联接,可以使用表每类hirarchy策略。然后,每个子类都驻留在同一个表中,并使用鉴别器列进行鉴别 我已经对15个子类使用了这种方法
唯一的缺点是你不能在子类的属性上定义NOTNULL约束,你必须在代码中处理它。+1一个好问题,我正在设计一个可能有20个子类型的系统,我有同样的问题。