2013-07-11 3 views
1

나는 위치 데이터의 두 가지 데이터 세트를 가지고있다; 하나는 세계의 모든 도시 목록과 함께 작성된 데이터 세트이고 다른 하나는 사용자 입력의 위치 데이터입니다.데이터 셋 A를 데이터 셋 B로 정규화하려면 어떻게해야합니까?

모든 사용자 입력 데이터를 전체 데이터 집합에 매핑하려고합니다. 예를 들어, 사용자가 입력 한 데이터는 여러 줄이있을 수

  • 샌프란시스코를
  • 산 프랜
  • SF

나는에 샌프란시스코에 그 모든 행을 매핑 할 완전한 데이터 세트.

어떤 절차, 방법, 도구 등을 권하고 싶습니까? 나는 정규식에 대해 생각했지만 모든 다른 도시를 검색 할 수 있도록 자동화하는 방법을 모르겠습니다.

해설 : 컴퓨터가 SF와 같은 것이 샌프란시스코를 의미하는지 여부를 알지 못합니다. 이는 인간의 판단에 달려 있습니다. 일반적으로이 문제에 접근하는 방법에 대한 도움을 찾고 있습니다. 한 세트를 다른 세트에 매핑하는 방법을 모르겠습니다. 그 부분은 제가 붙어 있습니다.

+0

데이터 연결 방법에 대해 좀 더 구체적으로 설명하십시오. 컴퓨터는 "Fran"가 "Francisco"의 처음 네 글자이기 때문에 "San Fran"와 "San Francisco"가 같은 장소라는 것을 알고 있습니까? "SF"는 "San Fernando"또는 "Sfitzbergen"또는 "Spring Field"가 아니라 "San Francisco"임을 어떻게 알 수 있습니까? 아니면 어딘가에 유효한 약어 목록을 가져올 계획입니까? – Jay

+0

Jay에게 회신 해 주셔서 감사합니다. 샌프란시스코로 샌프란시스코를 실제로 매핑하는 도구는 제가 붙어있는 것 같습니다. 여러분은 아마도 처음 몇 글자를 보게 될 것입니다. 그러나 축약어를 사용하면 흔히 손으로 직접 할 것입니다. 나는 세부적인 것보다 접근 방법에 더 박혀있다. – user2573743

답변

0

죄송합니다. 돌아 오기까지 너무 오래 걸렸습니다. 나는 그곳에서 휴가를갔습니다! 아직 작업 중이라면

좋습니다. "place"라는 테이블과 "city"라는 필드가 있다고합시다. 첫 번째 그러나 많은 문자를 "좋아하는"연산자로 간단하게 일치시킬 수 있습니다.

select <whatever> from place where city like 'San Fran%'; 

"san fran"은 샌프란시스코와 일치하므로 대소 문자는 무시하고 싶을 것입니다. 이 경우 :

select <whatever> from place where upper(city) like upper('San Fran%'); 

실생활에서 "San Fran"를 하드 코딩하지는 않지만 실행 시간 매개 변수가됩니다.

도시에 색인을 생성하면 매우 빠릅니다. 대문자와 소문자를 구별하기 위해 "upper"를 사용한다면 upper (city)에 인덱스를 생성하십시오.

다른 케이스도 처리 할 수 ​​있습니다. 약어는 샌프란시스코의 경우 'SF'와 같습니다.

사용중인 SQL의 맛을 말하지 않습니다. 함수를 지원하는 경우 임의의 이름으로 약어를 구성하는 함수를 작성할 수 있습니다. 이 함수는 하위 문자열 (또는 SQL과 동등한 것)을 사용하여 이름의 문자를 검사 할 수 있습니다.이 함수는별로 표준이 아닙니다. 공백을 찾은 다음 첫 번째 문자를 가져온 다음 공백을 따르는 모든 문자를 가져옵니다. 그걸 돌려 보내라. 이 함수를 "abbreviate()"라고합니다. 다음 쿼리는 다음과 같습니다

select <whatever> from place where upper(city) like concat(@city,'%') or abbreviate(city) = @city; 

(위의이 매개 변수는 "@"로 시작하는 이름이 MS SQL 서버에서 같을 것이다 것입니다.) 그런 다음에 인덱스를 만들 것

대문자 (도시)와 약어 (도시)를 사용하여 빠르게 유지합니다.

만약 당신이 그보다 더 유연하고 싶다면, 나는 당신이 처리하고자하는 모든 경우를 고려할 방법이 없다고 생각합니다.사용자가 "frisco"를 입력하고 라스베가스를 얻기 위해 샌프란시스코 또는 "라스베가스"를 찾을 수있게하려는 경우처럼 도시 이름에 입력 된 문자열을 검색 할 수 있습니다 (예 : '도시'% frisco % ') ". 그러나 거기에는 두 가지 큰 문제가 있습니다. 하나는, 당신은 많은 거짓 조회수를 얻게 될 것이라고 생각합니다. 아마도 많은 사람들이 사용자에게 다소 신비 롭습니다. 마찬가지로 "san"을 입력하고 "San Francisco"와 "San Diego"뿐만 아니라 "Thousand Oaks, California"도 얻습니다. 두 번째로 SQL은 LIKE 절이 와일드 카드로 시작될 때 색인을 사용할 수 없으므로 이와 같은 검색은 매번 전체 파일 검색을 의미합니다. 그리고 사용자가 "빅 애플"을 입력 할 때 "Beantown"또는 New York을 입력 할 때 Boston을 찾고자한다면 완전히 다른 영역에 속하게됩니다.

다양한 변형을 사용하려면 닉네임 테이블이 필요합니다. 이 경우 장소 이름이 포함되지 않은 "장소"테이블을 만듭니다. 그런 다음 허용 할 이름의 모든 변형을 가진 place_name 테이블을 작성하십시오. place_name과 place 사이에 many-to-one 관계를 만듭니다. "기본 이름"을 식별하는 필드를 place_name에 포함 시키십시오. 그런 다음 쿼리가된다 : 하나의 이름으로 장소를

select n2.name, p.place_id, <whatever> 
from place_name n 
join place p on n.place_id=p.place_id 
join place_name n2 on n2.place_id=n.place_id and n2.is_primary=1 
where n.name like concat(@name,'%') or abbrev(n.name)[email protected]; 

가, 그 장소에 대해 하나의 PLACE_NAME 기록이있다.

대체 이름 대신 place_name 테이블에 모든 이름을 넣으면 장소를 찾기 위해 두 테이블 대신 한 테이블 만 검색하면됩니다. 그것은 인간 판독기와 db 엔진 모두에 대한 쿼리를 단순화합니다.

관련 문제