문제

이 질문에 대한 다양한 화신이 여기에 묻었지만 또 다른 기회를 줄 것이라고 생각했습니다.

끔찍한 데이터베이스 레이아웃이있었습니다. 단일 엔티티 (위젯)가 두 개의 테이블로 나뉘 었습니다.

CREATE TABLE widgets (widget_id int(10) NOT NULL auto_increment)

CREATE TABLE widget_data ( widget_id int(10), field ENUM('name','size','color','brand'), data TEXT)

이것은 이상적이지 않았습니다. 특정 이름, 색상 및 브랜드의 위젯을 찾고 싶다면 Widget_Data 테이블에서 3 방향 조인을해야했습니다. 그래서 합리적인 테이블 유형으로 변환했습니다.

CREATE TABLE widgets (widget_id int(10) NOT NULL auto_increment, name VARCHAR(32),size INT(3),color VARCHAR(16), brand VARCHAR(32))

이것은 대부분의 쿼리를 훨씬 더 좋게 만듭니다. 그러나 그것은 검색을 더 어렵게 만듭니다. 예전에는 위젯을 검색하고 싶다면 '%black%'에 대해 SELECT * FROM widget_data WHERE data LIKE '%black%'. 이것은 검은 색이거나 Blackwell Industries 또는 무엇이든 만들어지는 모든 위젯 인스턴스를 제공합니다. 나는 어떤 필드가 일치했는지 정확히 알고 있으며,이를 사용자에게 보여줄 수 있습니다.

새로운 테이블 레이아웃을 사용하여 유사한 검색을 어떻게 실행합니까? 물론 할 수 있습니다 WHERE name LIKE '%black%' OR size LIKE '%black%'... 그러나 그것은 어리석은 것처럼 보이고, 나는 여전히 어떤 필드가 일치했는지 모른다. 일치하려는 각 열에 대해 별도의 쿼리를 실행할 수 있습니다. 이는 모든 경기와 일치 방식을 줄 수 있지만 성능이 적용됩니다. 어떤 아이디어?

도움이 되었습니까?

해결책

두 가지 상충되는 요구 사항이 있습니다. 모든 데이터가 단일 필드에있는 것처럼 검색하려고하지만 어떤 특정 필드가 일치하는지 식별하려고합니다.

당신에게 아무런 문제가 없습니다 WHERE name LIKE '%black%' OR size LIKE '%black%'... 표현. 정의한대로 테이블에서 완벽하게 유효한 검색입니다. 코드에서 결과를 확인하여 어떤 것이 일치했는지 확인하는 것이 어떻습니까? 최소 오버 헤드입니다.

SQL에 대한 깨끗한 구문을 원한다면 테이블에서보기를 만들어 다른 필드를 연결하는 것으로 구성된 추가 필드를 추가 할 수 있습니다.

CREATE VIEW extra_widget_data AS
  SELECT (name, size, color, brand,
          CONCAT(name, size, color, brand) as all_fields)
  FROM widget_data;

그런 다음이 필드에 인덱스를 추가해야합니다.이 필드는 더 많은 공간, CPU 유지 관리 등이 필요합니다. 그만한 가치가 없다고 생각합니다.

다른 팁

당신은 일부를 포함시킬 수 있습니다 WHERE 열 선택으로 표현. 예를 들어:

SELECT 
  *, 
  (name LIKE '%black%') AS name_matched,
  (size LIKE '%black%') AS size_matched
FROM widget_data 
WHERE name LIKE '%black%' OR size LIKE '%black%'...

그런 다음 값을 확인하십시오 name_matched 대본 측면에.

그것이 성능에 어떤 영향을 미치는지 잘 모르겠습니다. 생산에 가기 전에 Feal Free를 테스트하십시오

MySQL 전문 검색 기능을 살펴보고 싶을 것입니다.이를 통해 Varchar 유형의 여러 열에 일치 할 수 있습니다.

http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top