我是从 c#/NHibnernate 的角度问这个问题,但它通常适用。令人担忧的是,HiLo 策略通过 id 的速度非常快,例如,低记录数表(例如用户)与高记录数表(例如评论)共享同一组 id。因此,您可以通过其他策略更快地获得高数字。那么人们推荐什么?
代码端: int/uint/long/ulong?
数据库端: int/bigint?
我的感觉是多头和双头,但想要一个健全的检查:)
请您参考如下方法:
补充 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 column nr limitation),它会打扰您。还要记住,每个请求 ID 范围的实体都会锁定所有其他实体,这在某些情况下可能会导致死锁。
希望这对您有所帮助!
问候,
菲利普