私は演劇を扱うウェブサイトを運営しています (そして現在、完全に見直し中です) (興味があれば njtheater.com)。
データベースから演劇のリストを照会するとき、「ベニスの商人」を「M」でソートしたいと思います。もちろん、芝居の名前を表示するときは、前に「The」が必要です。
これを処理するデータベースを設計する最良の方法は何ですか?
(MS-SQL 2000 を使用しています)
私は演劇を扱うウェブサイトを運営しています (そして現在、完全に見直し中です) (興味があれば njtheater.com)。
データベースから演劇のリストを照会するとき、「ベニスの商人」を「M」でソートしたいと思います。もちろん、芝居の名前を表示するときは、前に「The」が必要です。
これを処理するデータベースを設計する最良の方法は何ですか?
(MS-SQL 2000 を使用しています)
2 つの列で正しい軌道に乗っていますが、列を連結するのではなく、表示可能なタイトル全体を 1 つの列に格納することをお勧めします。もう 1 つの列は、純粋に並べ替えに使用されます。これにより、単純な接頭辞に固執するのではなく、並べ替えと表示を完全に柔軟に行うことができます。
これは、検索時のかなり一般的なアプローチです (これは並べ替えに関連しています)。1 つの列 (インデックス付き) は、大文字と小文字が区別されたり、句読点が削除されたりします。この場合、このフィールドの値に先頭の冠詞を削除するという文法規則も適用します。この列は、検索またはソートの比較キーとして使用されます。もう一方の列は索引付けされず、表示用に元のキーが保持されます。
タイトルを TITLE-PREFIX と TITLE-TEXT (またはそのようなもの) の 2 つのフィールドに保存します。次に、2 番目で並べ替えますが、間にスペースを入れて 2 つの連結を表示します。
この問題に対する私自身の解決策は、データベースに 3 つの列を作成することでした。
article varchar(4)
sorttitle varchar(255)
title computed (article + sortitle)
"article" は "The "、"A " "An " (それぞれの末尾のスペースに注意) または空の文字列 (null 以外) のいずれかになります。
「sorttitle」は先頭の記事を除いたタイトルになります。
このように、SORTTITLE で並べ替えて、TITLE を表示できます。計算されたフィールドで行われる実際の処理はほとんどなく (したがって高速です)、挿入時に行う作業はわずかです。
私は doofledorfer に同意しますが、単一のスペースであると想定するのではなく、プレフィックスの一部として入力されたスペースを保存することをお勧めします。これにより、ユーザーの柔軟性が向上します。クエリ自体で何らかの連結を行うこともできるため、ビジネス ロジックの一部としてフィールドをマージする必要はありません。
これが SQL Server で実行できるかどうかはわかりません。関数ベースのインデックスを作成できる場合は、フィールドで正規表現を実行するか、独自の関数を使用するインデックスを作成できます。これにより、追加のフィールドよりもスペースが少なくなり、データベース自体によって最新の状態に保たれ、完全なタイトルを一緒に保存できます。