2

ac#/NHibnernate の観点からこれを求めていますが、一般的に適用できます。懸念事項は、HiLo 戦略が ID を非常に迅速に処理することです。たとえば、レコード数の少ないテーブル (ユーザーなど) が、レコード数の多いテーブル (コメントなど) と同じ ID のセットから共有されています。そのため、他の戦略よりも早く高い数値に到達できる可能性があります。それで、人々は何を勧めますか?

コード側: int/uint/long/ulong?

DB側: int/bigint?

私の気持ちはロングとビギントで行くことですが、健全性チェックをお願いします:)

4

2 に答える 2

5

ディエゴの答えを補完する..

各ジェネレーターでパラメーターを設定tableできますが、IMO では、ID を保持するためだけに不要な数のテーブルが作成されます。

おそらく、(同じテーブル内の)エンティティごとに 1 つの行を使用することをお勧めします。オプションのパラメーターを使用して、HiLo アルゴリズムを構成でき、必要な回線のみをロックします。各エンティティには個別のシードがあります。FluentNH では、次のようになります。

        Id(x => x.Id, "Id")
            .GeneratedBy.HiLo("IdsTable", "id", "20", 
                p => p.AddParam("where", "table = 'mappedent'"));

それにもかかわらず、where余分なパラメーターを回避して、別の列を設定することもできます (DB でも異なる ID タイプを持つことができます)。ただし、多数のエンティティがある場合は気になります (DB の列数の制限のため)。また、ID 範囲を要求するすべてのエンティティが他のすべてのエンティティをロックすることにも注意してください。これにより、状況によってはデッドロックが発生する可能性があります。

お役に立てれば!

よろしく、

フィリペ

于 2010-05-11T23:16:16.670 に答える
2

あなたはおそらく長いと安全です。

とにかく、すべてのエンティティに同じテーブルを使用する必要はありませんtable各ジェネレーターのパラメーターを異なる値に設定できます。

于 2010-05-10T12:14:21.687 に答える