主キーが Guid 型のテーブルがあります。MVC アプリケーションで、このテーブルにレコードを追加したいと考えています。Guid.newGuid()
新しい Guid を作成するを知っています。これはうまく機能しますが、懸念があります。作成された Guid が一意であること (データベースにまだ存在しないこと) をどのように保証しますか? 新しい GUID がデータベース レコード全体で一意であることを確認するために、既存の値を比較して生成する方法はありますか?
3 に答える
GUID 生成手法の全体的な目的は、その必要がないことです。アルゴリズムは、以前に生成された他のすべての GUID にアクセスできない場合でも、グローバルに一意の値を生成します。
特に、アルゴリズムは 1 つの大きな乱数を生成するだけです。GUID には非常に多くのデータ ビットがあるため、そのうちの 2 つが同じ値を持つ可能性は限りなく小さくなります。本当に無視できるほど小さい。
より詳細な分析については、このテーマに関する Eric Lippert のブログを参照してください。(特にパート3。)
この結果として、GUID を一意の識別子として使用すると、数値識別子を使用する場合よりもデータベース内でかなり多くのスペースが必要になることに注意してください。適切なデータベースには、入力される一意の識別子になるように特別に設計された特別な列タイプがあります。このような列は、GUID よりもはるかに少ないスペースを使用しながら一意性を確保できます。
重複を生成する可能性は非常に低いです。UNIQUE
ただし、データベース テーブルに制約を課すことはできます。
ただし、新しい GUId がデータベースに存在する人と一致する可能性はほとんどありません。
しかし、それでも確実にしたい場合は、GUID に対して true または false を与える proc または何かを作成するだけです。true が返された場合は、再度生成し、一意の GUID が得られなくなるまでこのプロセスを繰り返します。