使用HiLo ID生成策略时,应使用哪些类型来保存ID?

时间:2010-05-10 08:15:36

标签: nhibernate database-design hilo

我是从c#/ NHibnernate的角度问这个问题,但它通常适用。令人担忧的是,HiLo策略非常快,但是例如低记录计数表(例如用户)从同一组id共享作为高记录计数表(例如注释)。因此,通过其他策略,您可以更快地获得更高的数字。那么人们推荐什么呢?

代码方: INT / UINT /长/ ULONG?

DBSide: INT / BIGINT?

我的感觉是长篇大论,但想要进行理智检查:)

2 个答案:

答案 0 :(得分:5)

补充迭戈的回答..

您可以在每个生成器上设置table参数,但IMO会导致不必要数量的表只是为了保存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范围的每个实体都会锁定所有其他实体,在某些情况下会导致您陷入僵局。

希望这有帮助!

此致

菲利普

答案 1 :(得分:2)

你可能很安全。

无论如何,你没有拥有为所有实体使用相同的表。您可以将每个生成器上的table参数设置为不同的值。