Nhibernate 使用HiLo ID生成策略时,应该使用哪些类型来保存ID?
我是从c#/NHibnernate的角度提出这个问题的,但它通常是适用的。问题是HiLo策略很快就通过了id,例如,低记录计数表(如用户)与高记录计数表(如注释)共享同一组id。因此,你可以通过其他策略更快地获得高数字。那么人们推荐什么呢 代码端: int/uint/long/ulong DBSide: int/bigintNhibernate 使用HiLo ID生成策略时,应该使用哪些类型来保存ID?,nhibernate,database-design,hilo,Nhibernate,Database Design,Hilo,我是从c#/NHibnernate的角度提出这个问题的,但它通常是适用的。问题是HiLo策略很快就通过了id,例如,低记录计数表(如用户)与高记录计数表(如注释)共享同一组id。因此,你可以通过其他策略更快地获得高数字。那么人们推荐什么呢 代码端: int/uint/long/ulong DBSide: int/bigint 我的感觉是喜欢long和bigints,但我想做一次理智的检查:)你可能对long比较安全 无论如何,您不必对所有实体使用相同的表。您可以将每个生成器上的表参数设置为不同的
我的感觉是喜欢long和bigints,但我想做一次理智的检查:)你可能对long比较安全
无论如何,您不必对所有实体使用相同的表。您可以将每个生成器上的
表
参数设置为不同的值。补充Diego的答案
您可以在每个生成器上设置table
参数,但这会导致不必要的表数,仅用于保存ID
我可能会建议每个实体使用一行(在同一个表中)。使用可选参数,您可以配置HiLo算法,它将只锁定必要的行。每个实体都有不同的种子。在FluentNH中,类似于:
Id(x => x.Id, "Id")
.GeneratedBy.HiLo("IdsTable", "id", "20",
p => p.AddParam("where", "table = 'mappedent'"));
尽管如此,您也可以避免使用where
额外的参数,只需设置一个不同的列(这允许您在DB中拥有不同的ID类型)。但是,如果您有大量的实体(因为DBs列nr限制),这会给您带来麻烦。还要记住,每个请求ID范围的实体都会锁定所有其他实体,这在某些情况下会导致死锁
希望这有帮助
问候,
菲利佩谢谢菲利佩。我以前从未遇到过HiLo的锁定问题。你知道有关于这方面的进一步阅读吗?@UTC-实际上锁定问题很简单:由于每个实体使用一列,但所有信息都在同一行中,NH锁定整行以确保没有其他会话工厂获得ID,ti可能会给你带来问题。这就是为什么我建议使用
where
custom参数,其中每个实体都有自己的行(在同一个表中)。我想我的帖子并不是很清楚这个策略。我更改了一些单词并加粗了其他单词以确保理解。希望这有帮助!干杯。啊,现在清楚了。有趣的方法是,我将研究如何使用此方法。注意:如果您对所有实体使用除一个hilo表和列之外的任何内容,则SchemaExport会给您带来麻烦: