ここには多くのトレードオフがあります。実際には文字列キーを頻繁に使用しますが、多くの場合、結合に代理のセカンダリキーを含めます(MySQLを使用している場合は明らかに逆になります)。ただし、そうしない場合があります。
最初に、dbがこれをうまく処理できる主キーとして自然キーを宣言するのが好きです(たとえば、PostgreSQL)。これは正規化に役立ち、データベース設計をより明確にします。代理キーを使用すると、簡単に参加できます。
私が通常サロゲートキーを追加する理由は2つあります。
自然な鍵が何であるかは必ずしも明確ではありません。これらは時々変更する必要があります。結合および参照整合性に使用される自然な複合キーの変更は複雑であり、エラーが発生しやすくなります。
複合キーの結合パフォーマンスには問題があり、自然なキールートをたどると、そこに行き詰まります。
ただし、自然キーが定義、単一列、およびテキストの場合、通常は文字列キーに参加します。これを行う理由は、これによりルックアップでの結合が回避されることが多いためです。最も一般的な使用法は、列挙型のユースケースに関する適切なdb設計を提供することです。ほとんどの場合、これらはルーチンクエリの追加の結合を必要としません。この場合、結合キーとしての文字列キーは完全に理にかなっています。
たとえば、LedgerSMBでは、アカウントの分類を保存します。これらは文字列参照によって識別されます。その他のデータは、アカウントに影響を与える可能性のある分類の組み合わせに関する規則を実施するために使用される文字列参照とともに保存されます。ロジックが必要なのは、一連のカテゴリを保存するときだけなので、文字列キーに参加します。
デフォルトが整数キーになる理由については、単にインデックスサイズの問題ではないと思います。大きな問題はキーの管理です。キーは任意であり、数百万のレコードを処理する可能性があるため、一意の文字列を生成する方法が必要です。このためにUUIDを使用する場合もありますが、UUID衝突の可能性はゼロではなく、数十億のレコードが保存されているため、この可能性は、増分整数型との衝突の可能性がゼロである間に実際に見られるほど高くなります定義により。