Asp.net mvc 有人能帮我理解为什么使用NHibernate时自动标识(int)不好吗?
我已经看到了很多关于使用Guid而不是int的评论(从NHibernate的角度来看),其结论是使用auto-identity打破了UoW模式 有一个简短的问题描述,但它并没有真正告诉我“为什么”它打破了模式(除非我误解了可能的情况)Asp.net mvc 有人能帮我理解为什么使用NHibernate时自动标识(int)不好吗?,asp.net-mvc,nhibernate,Asp.net Mvc,Nhibernate,我已经看到了很多关于使用Guid而不是int的评论(从NHibernate的角度来看),其结论是使用auto-identity打破了UoW模式 有一个简短的问题描述,但它并没有真正告诉我“为什么”它打破了模式(除非我误解了可能的情况) 有人能给我一些启发吗?我认为关键的突破因素是,获取自动递增的值需要实际写入数据库,而nHibernate可能会延迟或可能永远不会执行该操作。有几个主要原因 使用Guid可以跨多个数据库识别单个实体,包括六个具有相同模式但不同数据的关系数据库、一个文档数据库等。当
有人能给我一些启发吗?我认为关键的突破因素是,获取自动递增的值需要实际写入数据库,而nHibernate可能会延迟或可能永远不会执行该操作。有几个主要原因
- 使用
可以跨多个数据库识别单个实体,包括六个具有相同模式但不同数据的关系数据库、一个文档数据库等。当您有多个单独的数据存储位置时,这一点就变得很重要—这也意味着您的案例:您有一个dev数据库一个产品数据库,对吗Guid
- 使用
使NHibernate能够将更多语句批处理在一起,在工作/事务单元的最后执行更多的数据库工作,并减少到数据库的往返总次数,从而提高性能并带来其他好处Guid
Guid
s不会创建较差的索引—从本机上讲,它们创建较差的聚集索引。有两种解决方案
- 使用部分顺序的
。对于NHibernate,这意味着使用Guid
id生成器,而不是Guid.comb
id生成器。Guid
是部分顺序的,具有良好的性能,但保留了非常高的随机性Guid.comb
- 让您的
主键成为Guid
索引,并将聚集索引放在另一个自动递增列上。您可以决定映射此列,在这种情况下,您将失去更好的批处理和更少的往返的好处,但您将重新获得易于放入URL的短数字的所有好处。或者您可以决定de不映射此列并将其完全保留在数据库中,在这种情况下,非聚集的
s作为主键可以获得更好的性能,而NHibernate的往返次数更少也可以获得更好的性能Guid