테이블 디자인에 대한 질문
-
03-07-2019 - |
문제
사용자를위한 검색 옵션을 제공하고 있습니다. 그들은 도시 이름으로 검색 할 수 있습니다. 문제는 내가 저장 한 도시 이름이 "세인트 루이스"와 같은 것입니다. 그러나 사용자가 "세인트 루이스"또는 "세인트 루이스"에있는 경우에도 세인트 루이스를 찾고 싶습니다. 어떻게 든 조회 테이블을 만들 수있는 방법에 대한 제안이 있습니까?
해결책
만들다 둘 테이블.
하나는 도시에 관한 모든 것을 포함합니다.
하나는 도시에 대한 많은 이름과 첫 번째 테이블의 ID와 NAES의 외국 키 협회가 포함되어 있습니다. 그래서 당신은 City와 City_names 사이에 하나에서 많은 관계가 있습니다.
이제 유일한 문제는 각 도시마다 하나의 이름을 선호하는 이름입니다. 우리는 다음과 같은 몇 가지 방법을 수행 할 수 있습니다. 1) 첫 번째 테이블은 두 번째 테이블에 FK를 가질 수 있습니다. 그러나 이것은 원형 의존성을 만듭니다. 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;
여기에는 추가 이점이 있습니다. 모든 도시와 마을을 덮지 않으면 두 번째 테이블을 사용하여 마을/마을/카운티를지도 할 수 있습니다.
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 또는 스핑크스 - 이런 종류의 문자열 매핑을 기본적으로 지원할 수 있습니다.
나는 이것을 다루는 여러 가지 가능한 방법을 봅니다. 하나는 a입니다 Soundex 영어 문자열의 유사성과 일치하는 조회 알고리즘. 또한 이것은 다음과 같은 일부 데이터베이스에서 기본적으로 지원됩니다. PostgreSQL.
또 다른 방법은 단순히 사용자에게 여러 가지 제안을 입력 할 때 자동 완성 기능을 제공하는 것일 수 있습니다. 이런 식으로 사용자는 원하는 조회 도시 이름을 직관적으로 선택합니다.
일반적인 접근 방식으로, 삽입 할 때와 검색 할 때 품목을 정규화 할 수 있습니다.
정규화 규칙은 다음과 같습니다.
Saint => St
St. => St
등.
그런 다음 정규화 된 이름이 일치해야합니다.
IMHO 나는 데이터베이스를 내버려두고 대신 응용 프로그램에 도시의 다운 다운 목록이 있습니다. 더 쉽고 깨끗하며 추가가 필요하지 않습니다.
첫 번째 답변에서 옵션이 마음에 듭니다.
또 다른 생각은 사용자가 Coudl 업데이트하는 해당 도시의 태그에 대한 열을 갖는 것입니다.
즉
뉴욕시는 공식 이름입니다.
이 도시의 태그는 숫자가 될 것입니다 (Manhattan, NY, NYC, The City, Big Apple ..) 등은 주요 도시 테이블에서 그 쓰레기를 모두 원하지 않을 것입니다. 따라서 열에 집어 넣고 검색어에 따라 검색 한 다음 찾은 경우 올바른 이름을 반환하십시오.
시소러스 항목에는 내장 된 SQL FTS 속성을 사용할 수 있습니다. 이를 통해 전체 텍스트 검색 내부에서 사용자 정의 단어 맵을 벌릴 수 있습니다. 이렇게하면 FTS와 다른 쿼리를 혼합하지 않고 FTS 내부의 모든 것을 유지할 수 있습니다.
2005/8 사이에 다른 버전의 SQL을 사용하는 버전은 확실하지 않으므로 2005 / 8에 대한 좋은 연습이 있습니다. http://arcanecode.com/2008/05/28/creating-custom-thesaurus-entries-in-sql-server-2005-2008-full-text-search/