2009-04-03 7 views
8

私はデータベースの主キーとしてのGUIDの使用を調査しています。これまでのところ、賛否両論は短所を上回るようです。しかし、私はGUIDが私が望むものではないかもしれない1つのポイントを見ます。GUIDと自動インクリメント整数の両方を使用する

私のアプリケーションでは、ユーザーはユーザーフレンドリーなIDに基づいてオブジェクトを識別できる必要があります。たとえば、フルネームを入力せずに特定の製品を取得する場合は、製品のIDを使用できます。 GUIDはそのようなことを覚えておくのは簡単ではありません。

私が考えていた解決策は、GUIDと自動インクリメント整数の両方を使用することです。 GUIDは行の主キーになりますが、自動インクリメント整数はアプリケーションのフィルタリング関数で使用されるインデックスになります。ただし、すべてのSQL SELECT、UPDATE、DELETEステートメントはGUIDを使用します。

GUIDを使用したい主な理由は、2つのデータベースをマージする際の衝突を防ぐためです。データベース#1とデータベース#2の両方にProduct#2がある場合、インポータスクリプトはIDとそれを参照するすべての外部キーを変更する必要があります。 GUIDを使用すると、テーブル自体のユーザーフレンドリーなIDを変更するだけで済みますが、外部キーはインポートされた各レコードに固有のGUIDを使用するため、変更することなく動作します。

私の質問は、自動増分整数インデックスとGUID主キーを持つと大きな問題(GUIDフィールドのサイズと簡単なページの断片化に加えて)がありますか?

答えて

13

私はいつも私のデータベースにサロゲート主キーを使用する傾向があります。 これは、問題のドメインでこれらの主キーが実際の意味を持たないため、これらの主キーは決してユーザーに公開されません。 (このサロゲート主キーがGUIDまたはIDのIDの場合、これは要件に応じて異なります)。

ユーザーフレンドリーなIDに基づいてオブジェクトを識別できるようにする必要があるとすれば、このユーザーフレンドリーなIDは「問題のドメイン」に属する値だと思います。 これは、このIDが実際にテーブル内の属性である必要があることを意味しますが、テーブル内のプライマリキーとして使用しないでください。

これにより、関連する外部キーの変更を心配することなく、このようなユーザーフレンドリーなIDの値を簡単に変更できます(必要な場合)。 AUTO_INCREMENTが、それはまたNOT NULLをする必要があります意味だけPRIMARY KEYであってもよいよう

0

MySQLでは、あなたは、あなたの数値IDPRIMARY KEYように設定する必要があります。

あなたはまだあなたのGUID列にUNIQUE INDEXを定義し、InnoDBテーブルがないGUIDに、数値idにクラスター化されますが、どこでもそれを使用することができます。

+0

申し訳ありませんが、私はSQL Server 2008を使用していることを忘れています。 –

0

あなたのサロゲートIDを外部に公開してはならないという考え方があります。ビジネスIDが必要な場合は、別のものを使用する必要があります。

This Wikipedia articleは、例えば、これは言う:

ディスアソシエーション

生成された代理キー の値は、 - 彼らは生成され、任意であるので、 - の 現実世界の意味とは関係がありませんデータ が連続して保持されます。 外部キーを保持している行を調べると、 代理キーには、 は、参照番号 を保持することの意味を理解することができません。その行自体のデータは です。あるレイヤーが がこの間接参照に追加されています 外部キー結合 を移動しようとしている間に移動する必要があります。 データ項目の意味。これはまた、 検査で間違ったデータが明らかでないので、監査を難しくすることができます。

サロゲートキーもエクスポートされ、共有されるデータの場合は ナチュラルではありません。 特定の難しさは、スキーマの2つの のインスタンスが論理的に同じこと を(つまり、 - 彼らは ビジネスセンスが同じである)を意味し、レコード を保持することができるということですが、その歴史のために 異なる鍵を持っています キーの割り当て方法「ライブを持つアプリケーション を実行するには、明らかに彼らは一時データ以外のデータベース 外部に露出することはありません をしている(最も :これに対処する アプローチは、代理キーが は、エクスポートしたりインポートんというルールを採用し にあります" データベースへの接続)。私の意見で

1

「なぜ 『のユーザーは、』ユーザーフレンドリーIDに基づいてオブジェクトを識別することができるはずです?

、ユーザーがコードを使用してレコードをitentifyなければならない。

のは、データベースを言ってみましょう

テーブルと椅子を持っているとしましょう。ユーザーとしては、私は好きですか?(あなたはあなたが質問で述べたように)製品を含んでいます。 1と2よりtblとchrを使用して、私が話していることを特定します。

+0

ルックアップ機能は各モジュールで実行されます。したがって、ユーザーが "Products"モジュールでIDを検索しようとしている場合、アプリケーションは既に製品を望むことを知っています。 –

0

あなたの質問についてより具体的には、イエスのデータベースの主キーとしてGUIDを使用して他の問題があります。

は問題が主キーとしてGUIDを使用してそれほどではないが、そのテーブルのクラスタ化インデックスとしてとして非シーケンシャルGUIDを使用します。

ここでは、クラスタ化インデックスとして他のフィールドを使用するか、この断片化を避けるために逐次GUIDを使用します。

関連する問題