Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate 使用HiLo ID生成策略时,应该使用哪些类型来保存ID?_Nhibernate_Database Design_Hilo - Fatal编程技术网

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

Nhibernate 使用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比较安全 无论如何,您不必对所有实体使用相同的表。您可以将每个生成器上的表参数设置为不同的

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

代码端: int/uint/long/ulong

DBSide: int/bigint


我的感觉是喜欢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会给您带来麻烦: