2017-12-16 21 views
-2

나는 아래와 같은 테이블을 가지고있다.내가 사용하는 기존 4 테이블 시스템 이외의 태그 기반 레코드 시스템으로 시작하는 오픈 소스 솔루션이나 빠른 시작이 있습니까?

나는 이와 같은 4 개의 MySQL 테이블을 가지고있다;

======================== 
id1 | brand | tags 
======================== 
111 | mercedes | xx 
-----+-----------+------ 
222 | mercedes | yy 
-----+-----------+------ 
333 | ford  | xx,yy 
-----+-----------+------ 
444 | audi  | yy,zz 
-----+-----------+------ 
555 | jaguar | xx,yy,zz 
======================== 

표 2

======================== 
id2 | model | id1 
======================== 
aaa | s class | 111 
-----+-----------+------ 
bbb | figo  | 333 
-----+-----------+------ 
ccc | a6  | 444 
-----+-----------+------ 
ddd | xf  | 555 
-----+-----------+------ 
eee | a4  | 444 
======================== 

표 3

============ 
id1 | id3 
============ 
111 | xx 
-----+------ 
222 | yy 
-----+------ 
333 | xx 
-----+------ 
333 | yy 
-----+------ 
444 | yy 
-----+------ 
444 | zz 
-----+------ 
555 | xx 
-----+------ 
555 | yy 
-----+------ 
555 | zz 
============ 

표 4

================== 
id3 | tagdetails 
================== 
xx | description 
-----+------------ 
yy | description 
-----+------------ 
zz | description 
================== 

내 의도는 조합 검색입니다. 나는 PHP + MySQL을 사용한다. 나는 입력으로주는 태그로 레코드를 가져오고있다. 예를 들어 xx을 입력하면 mercedes, fordjaguar이 표시됩니다. xx,yy,zz을 줄 때 나는 jaguar만을 얻습니다. 엄청난 수의 레코드가있을 때 이것은 매우 비효율적 인 솔루션입니다. 기존의 유사한 솔루션을 무료로 사용할 수 있습니까?

감사합니다.

+0

예, CSV 데이터로 자동차 이름을 저장 안 sqlfiddle 데모는, 그러나 오히려 별도의 기록으로 그들을 탈출. 하지만 다른 질문이 있습니까, 그렇지 않다면 왜 다른 테이블을 게시 했습니까? –

+0

전 PRA로 사용하기 위해이 질문을 게시하지 않는다는 것을 보여주기 위해 전체 테이블을 게시했습니다. 나는 현재이 솔루션을 사용하고 있으며, 말했듯이 이것이 효율적이지 않다는 것을 알고 있습니다.캐싱을 위해 "Apache Ignite"와 같은 필자의 요구 사항에 따라 사용자 정의 할 수있는 효율적인 솔루션이 있는지 묻습니다. –

+0

스키마를 변경하지 않고 작업 속도를 높이는 방법에 대해 질문하거나 디자인을 개선 할 방법을 찾고 있습니까? –

답변

0

이 유형의 응용 프로그램에는 SET 열을 사용할 수 있습니다. 열을 만들 때 열에 포함 할 수있는 최대 64 개의 값 목록을 지정하지만 데이터베이스에서는 이진 비트 집합으로 저장되므로 첫 번째 항목은 1, 두 번째 항목은 2, 세 번째 항목은 2, 세 번째 항목은 4, 8, 16입니다. , 32 등

이름이나 숫자로 액세스하여 LIKE을 사용하여 텍스트 값이나 모든 비트 연산자를 사용하여 검색 할 수 있습니다. 비트 세트의 아름다움은 가능한 모든 태그 조합이 고유 번호를 갖게합니다. xxx = 1yyy = 2이면 두 태그가있는 자동차는 = 3이됩니다.

여기에 게시 테이블 구조가 그 다음은 모든 값을 필요한 열을 추가하고 계산합니다 정확 가정 :이 열을 추가

SELECT @tags:= GROUP_CONCAT(id3 SEPARATOR '", "') FROM table4; 
SET @s = CONCAT('ALTER TABLE table1 ADD tagset SET("', @tags, '")'); 
PREPARE stmt FROM @s; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
ALTER TABLE table4 ADD tags int NULL; 
SET @tags:= NULL; 
UPDATE table4 SET tags = (SELECT (@tags:= IF(@tags IS NULL, '1', @tags * 2))); 
UPDATE table1 SET tagset = tags; 

각 태그의 숫자 값과 SET과 표 4 할 열을 올바른 태그가 설정된 table1로 설정하십시오. 그런 다음 yur 쿼리를 구조화하여 태그 이름을 기반으로 올바른 값을 계산합니다.

SELECT * FROM table1 WHERE tagset = (SELECT SUM(tags) FROM table4 WHERE id3 IN ('xx', 'yy')); 
// Using '=' will only return matches with tag xx and yy exactly 

SELECT * FROM table1 WHERE tagset & (SELECT SUM(tags) FROM table4 WHERE id3 IN ('xx')); 
// Using '&' will return all matches with xx 

다른 모든 비트 비교 연산자를 사용할 수 있습니다. 더 많은 정보 herehere

here