複数のテーブルが候補キー (例: ユーザー名) として文字列データを持ち、それに応じてインデックスが作成されるデータベースを実装しています。私が欲しいこれらのフィールドについて:
誰かがそれらのキーでテーブルをクエリするときの大文字と小文字の区別なし
アプリケーションが元のケースを使用してユーザーにデータを表示できるように、最初に書き込まれたケースを何らかの方法で保存する必要があります。
また、アプリケーション コードは特定の RDBMS に依存しない (またはすべきでない) ため、データベース スキーマを可能な限りデータベースに依存しないようにしたいと考えています。
また、データベースで実行されるクエリの大部分は、クライアントによるテーブルへの直接アクセスではなく、アプリケーション コードによって実行されることにも注意してください。
これを実装する際に、私は多くの厄介な問題に遭遇しています。1 つは、すべての RDBMS が同じ方法で COLLATE を実装しているわけではないことです (大文字と小文字の区別がスキーマ レベルで調整可能であると思われる場合)。もう 1 つの問題は、照合順序と大文字と小文字の区別のオプションを複数のレベル (サーバー、データベース、テーブル (?)、列) で設定できるため、アプリケーションがどのような設定になるかを保証できないことです。さらに別の問題は、単に大文字と小文字を区別するだけでなく、COLLATE 自体が複雑になる可能性があることです (例: Unicode オプション)。
これらの頭痛の種をすべて回避するために、私が考えているのは、1 つのデータに対して 2 つの列を格納することで、この問題を完全に回避することです。1 つの列は元の大文字を使用し、もう 1 つの列はアプリケーション層によって小文字に変更されました。
例: テーブル内の 2 つのフィールド
user_name = "fredflintstone" (この一意のインデックス) orig_name = "FredFlintstone" (データのみ...制約なし)
私が見ているように、これの長所と短所は次のとおりです。
長所:
あいまいさはありません。アプリケーション コードが大文字と小文字の変換を管理し、基になる RDBMS/設定が変更されたときに単体テストが「不可解に」失敗することを心配する必要はありません。
インデックスの検索はクリーンであり、照合機能や LOWER() などの呼び出しによって速度が低下することはありません (そのようなことがインデックスの速度を低下させると仮定すると、これは論理的に思われます)。
短所:
倍増したデータに必要な追加のストレージ容量
ちょっと野蛮に見える
私はそれがうまくいくことを知っていますが、同時にそれは間違ったにおいがします.
これを行うのは非常識ですか/無意味ですか? 大文字と小文字の区別の問題を、現時点で私が思っているよりも簡単にする、私が知らない何かがありますか?