2

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

代码端:int/uint/long/ulong?

DBSide:int/bigint?

我的感觉是长期和bigingts,但想要一个健全的检查:)

4

2 回答 2

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 范围的实体都会锁定所有其他实体,这在某些情况下会导致您陷入死锁。

希望这可以帮助!

问候,

菲利普

于 2010-05-11T23:16:16.670 回答
2

你可能很安全。

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

于 2010-05-10T12:14:21.687 回答