NHibernate和hilo生成器:如何设计键表?

8
我即将把我的一些实体从identity切换到hilo id-generator。
我不知道保存下一个高值的表应该如何设计。
应该为所有实体使用单个表,还是针对一组相关实体使用单独的表?
每个实体都要使用另一个表吗?
应该为每个实体在单个表中使用另一行或列吗?
是否有任何最佳实践?需要考虑什么?每种方法都有优缺点吗?
1个回答

3
我认为没有单一的“最佳”实践方法,但了解HiLo的工作原理非常重要:
  • Table hilo生成器适用于不支持序列(sequence)的数据库,而序列更适合这个任务。
  • 类的 Hi 值在第一次保存该类的实例或用尽 Lo 值时被检索和更新。
  • 每个类使用不同的 Hi 值。
因此,您将需要考虑至少两个变量:
  • 争用。通过使用单独的表,您可以稍微改进性能。
  • 范围。对于非常大的数据库,您有更大的风险最终用完 Hi 值。
考虑到这一点,这只是品味问题。

那么您会考虑使用单独的表吗?争议:您是指并发事务吗?单个表如何影响性能?通过对其进行锁定吗?另一方面,当使用多个表时,每个受影响的表都需要进行更多的选择和更新。混合使用可能会很有用:为每组相关表创建一个表。 - Stefan Steinegger
是的,我会使用单独的表格,因为存在锁定问题。 由于生成器值在类之间不共享,即使您使用相同的表格,选择/更新的数量也是相同的。 再次牢记主要概念:这只是将表格用作序列生成器。 - Diego Mijelshon
为什么 select 和 update 的数量是一样的呢?当我只有一个表时,为什么它需要为每个需要 id 的类选择和更新同一个表? - Stefan Steinegger
因为它们是不同的TableHiLoGenerator实例,只是碰巧使用相同的表名。它们可以使用不同的字段、不同的max_lo值等。但是您可以自由地创建自己的HiLo实现,该实现使用单个表/序列用于所有类... - Diego Mijelshon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接