テーブル設計に関する質問
-
03-07-2019 - |
質問
ユーザーに検索オプションを提供しています。彼らは都市名で検索できます。問題は、保存した私の都市名が「セントルイス」のようなものだということです。しかし、ユーザーが" St。ルイ"または「セントルイス」。ルックアップテーブルを作成してそれを何らかの形で考慮する方法に関する提案はありますか?
解決
2つのテーブルを作成します。
1つには都市に関するすべてが含まれます。
1つには、都市の名前の束と、これらの名前を最初のテーブルのIDと関連付ける外部キーの関連付けが含まれます。したがって、cityとcity_namesには1対多の関係があります。
現在、唯一の問題は、都市ごとに1つの名前を区別することです。これが優先名です。これにはいくつかの方法があります。1)最初のテーブルには、2番目のテーブルへのfkがあり、優先名のidを保持します。ただし、これにより循環依存関係が作成されます。 2)2番目のテーブルis_prefferedにブール/ビット列を追加するだけです。
create table city (id not null primary key, other columns ) ;
create table city_name (
id not null primary key,
city_id int references city(id),
name varchar(80),
is_preferred bool
) ;
次にすべての名前を取得します。優先される名前が最初になります。
select name from city_names where city_id = ?
order by is_preffered desc, name;
これには追加の利点があります:すべての都市と町をカバーしていない場合、2番目のテーブルを使用して、カバーしていない町/村/郡を主要な都市にマッピングできます:
insert into city_name(city_id, name) values
( $id-for-New-York-City, 'New York'),
( $id-for-New-York-City, 'Manhattan'),
( $id-for-New-York-City, 'Big Apple'),
( $id-for-New-York-City, 'Brooklyn');
他のヒント
私がやることは、通常の略記表を作成し、曖昧な単語をプライマリテーブルで使用する単一の一貫したスペルにマップすることです。よくあるつづりの間違いやタイプミスを含めることができます。
ユーザーのリクエストを検索する前に、この表を使用してすべての単語を通常の形式に変換します。
つまり、あなたの場合、 shorthand-to-normal
テーブルには、
______________
| short|normal |
|______|_______|
|St |Saint |
|St. |Saint |
Apache Lucene / Solrなど、よりフル機能のフルテキスト検索エンジンを検討することをお勧めします。 または Sphinx -この種の文字列マッピングをネイティブでサポートできます。
これに対処するためのいくつかの可能な方法があります。 1つは、英語の文字列の類似性に一致する soundex ルックアップアルゴリズムです。さらに、これは PostgreSQL などの一部のデータベースでネイティブにサポートされています。
もう1つのアプローチは、ユーザーが入力するといくつかの候補が表示されるオートコンプリート機能をユーザーに提供することです。これにより、ユーザーは目的の検索都市名を直感的に選択できます。
一般的なアプローチとして、挿入時と検索時の両方でアイテムを正規化できます。
正規化ルールは次のとおりです。
Saint => St
St. => St
etc。
正規化された名前は一致するはずです。
私はデータベースをそのままにして、代わりにアプリケーション内の都市のダウンリストを作成します。より簡単で、よりクリーンで、余分な追加は必要ありません。
最初の回答のオプションが好きです。
もう1つの考えは、ユーザーが更新するその都市のタグの列があることです。
i.e。
ニューヨーク市が正式名称です。
この都市のタグは数になります(マンハッタン、NY、NYC、都市、ビッグアップルなど)e.t.c.ただし、メインのCitiesテーブルにあるすべての不要なファイルや、関連する子テーブルを作成して結合する必要はありません。そのため、列に入れて検索用語に基づいて検索しますが、見つかった場合は適切な名前を返します。
シソーラスエントリには、組み込みのSQL FTSプロパティを使用できます。これにより、全文検索内でカスタムワードマップを作成できます。そうすれば、FTSと他のクエリを混在させるのではなく、すべてをFTS内に保持できます。
2005/8の違いとして使用しているSQLのバージョンがわからないため、2005/8の良いチュートリアルがここにあります http://arcanecode.com/2008/05/28/creating-custom -thesaurus-entries-in-sql-server-2005-and-2008-full-text-search /