Navicatブログ

プライマリキーの選択 - パート3 2022年9月14日 Robert Gravelle

プライマリキーとしての文字列

リレーショナルデータベースのプライマリキーの選択に関するこのシリーズの最終回となる第3回では、文字列データをプライマリキー(PK)として使用する理由のいくつかを検討します。パート1で、ナチュラルプライマリキーとサロゲートプライマリキーについて説明し、一方を選択する理由を検討したことを思い出してください。パート2では、プライマリキーとしての文字列と数値のデータ型を調査し、どちらが好ましいかを確認しました。ここで記録を整理し、文字列(またはアルファベット)データが適切なPKを作成できるかどうかを結論付けます。

既製のキー

多くの場合、データには、普遍的な意味を持ち、整数ではない可能性のある賢明なナチュラルプライマリキーがあります。もしそうなら、整数型のためだけにサロゲートキーを追加しても、冗長性しか追加されません。パフォーマンスが若干低下する可能性がありますが、それは多くのデータベース開発者の評価では、正確性、整合性、および適切なモデリングほど重要ではありません。

アルファベットキーの明白でない利点は、短いシンボリック文字列が、(追加の結合なしで)データダンプで人間がすぐに判読できるようになることによって、デバッグを簡素化できることです。例えば、米国の州には、スキーマ外のキーとして一意で意味のあるアルファベットコードがあります。また、国にはアルファベットのISOコードがあります。また、車両のVIN番号、請求書IDなど、他にも無数の例があります。

GUIDをプライマリキーとして使用する

複数のデータベースがある場合、キーの自動インクリメントによって冗長なレコードが発生する可能性があります。この問題を回避する1つの方法は、GUIDを使用することです。GUID は、“Globally Unique Identifier“の略で、16バイトのバイナリデータ型で、テーブル、データベース、さらにはサーバー間で一意であることが保証されています。

GUIDの作成方法はデータベースによって異なりますが、SQL Serverでは、次のように NEWID()関数が使用されます:

SELECT NEWID()

UNIQUEIDENTIFIERデータ型を持つテーブルを作成するためのステートメントを次に示します。列のデフォルト値を設定するためには、defaultキーワードを使用し、NEWID()関数によって返される値としてデフォルト値を設定します。

USE EngDB
GO
 
CREATE TABLE EnglishStudents1
(
	Id UNIQUEIDENTIFIER PRIMARY KEY default NEWID(),
	StudentName VARCHAR (50)
 
)
GO
 
INSERT INTO EnglishStudents1 VALUES (default,'Shane')
INSERT INTO EnglishStudents1 VALUES (default,'Jonny')

これにより、新しいレコードがEngStudents1テーブルに挿入される度に、デフォルトで、NEWID()関数がId列に一意の値を生成するようになります。レコードを挿入する時は、最初の列の値として"default"を指定するだけです。これにより、デフォルトの一意の値がId列に挿入されます。

GUID対UUID

GUID(Microsoftによって使用される)とUUID(RFC4122によって定義される)は似ているように見え、同様の目的を果たしますが、微妙ではありますが時として重要な違いがあります。まず、UUIDとは何かを確認しましょう。

UUIDは、16進数のテキスト表現の128ビット値です。多くの人がUUIDはテキストとして保存されると考えているため、繰り返します。UUIDv4値はランダムであるため、一意性は保証されません。ただし、衝突の可能性はかなり低いです。また、UUIDが衝突するという非常にまれなケースでは、プライマリキー制約のおかげでDBによってキャッチされることも覚えておいてください。また、UUIDv4はほとんどのリレーショナルデータベースで完全に適切にインデックス化されていることも知っておいてください。

一部のMicrosoft GUIDドキュメントでは、GUIDの任意の位置に任意の16進数を含めることができますが、一方で、RFC4122では、バージョンフィールドとバリアントフィールドに特定の値が必要です。また、GUIDは全て大文字である必要がありますが、UUIDは「小文字として出力し、入力時に大文字と小文字を区別しない」必要があります。これにより、コードライブラリ間の非互換性が発生する可能性があります。

GUIDは、MicrosoftによるUUID標準の実装であると言えます。一意の値として使用される16バイト(128ビット)の値としてそれらを扱います。Microsoft用語では、GUIDと呼ばれますが、Microsoft用語を使用しない場合はUUIDと呼びます。

評決

リレーショナルデータベースのプライマリキーの選択に関するこのシリーズの最終回となる第3回では、文字列(またはアルファベット)データが適切なPKを作成できるかどうかを決定的に結論付けることに着手しました。答えはイエスですが、注意点があります。パフォーマンスがわずかに低下することが予想されます。その予想があなたを思いとどまらせないなら、短い記号文字列からGUIDやUUIDまで、いくつかのオプションを使用できます。最後に、固定長の文字列の方がパフォーマンスが良いため、varcharではなく固定長の文字列を使用してみてください。

ブログのアーカイブ
シェア