이 블로그 게시물이 흥미로울 것이라고 생각합니다. 태그 : 데이터베이스 스키마
문제 : 원하는만큼의 태그로 책갈피 (또는 블로그 게시물 등)에 태그를 지정할 수있는 데이터베이스 스키마를 원합니다. 나중에 쿼리를 실행하여 책갈피를 태그의 결합 또는 교차로 제한하려고합니다. 검색 결과에서 일부 태그를 제외 (예 : 빼기) 할 수도 있습니다.
"MySQLicious"솔루션
이 솔루션에서 스키마에는 테이블이 하나만 있으며 비정규 화됩니다. MySQLicious는 del.icio.us 데이터를이 구조의 테이블로 가져 오기 때문에이 유형을 "MySQLicious 솔루션"이라고합니다.
"search + webservice + semweb"에 대한 교차 (AND) 쿼리 :
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
AND tags LIKE "%webservice%"
AND tags LIKE "%semweb%"
"search | webservice | semweb"에 대한 통합 (OR) 쿼리 :
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
OR tags LIKE "%webservice%"
OR tags LIKE "%semweb%"
“search + webservice-semweb”에 대한 마이너스 쿼리
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
AND tags LIKE "%webservice%"
AND tags NOT LIKE "%semweb%"
"Scuttle"솔루션
Scuttle 은 데이터를 두 개의 테이블로 구성합니다. "scCategories"테이블은 "태그"테이블이며 "책갈피"테이블에 대한 외래 키를 가지고 있습니다.
“bookmark + webservice + semweb”에 대한 교차 (AND) 쿼리 :
SELECT b.*
FROM scBookmarks b, scCategories c
WHERE c.bId = b.bId
AND (c.category IN ('bookmark', 'webservice', 'semweb'))
GROUP BY b.bId
HAVING COUNT( b.bId )=3
먼저 모든 북마크-태그 조합이 검색됩니다. 여기서 태그는 "bookmark", "webservice"또는 "semweb"(c.category IN ( 'bookmark', 'webservice', 'semweb'))입니다. 검색된 세 개의 태그가 모두 고려됩니다 (HAVING COUNT (b.bId) = 3).
"bookmark | webservice | semweb"에 대한 Union (OR) 쿼리 :
HAVING 절을 생략하고 union이 있습니다.
SELECT b.*
FROM scBookmarks b, scCategories c
WHERE c.bId = b.bId
AND (c.category IN ('bookmark', 'webservice', 'semweb'))
GROUP BY b.bId
마이너스 (제외) "bookmark + webservice-semweb"쿼리, 즉 semweb이 아니라 북마크 및 웹 서비스입니다.
SELECT b. *
FROM scBookmarks b, scCategories c
WHERE b.bId = c.bId
AND (c.category IN ('bookmark', 'webservice'))
AND b.bId NOT
IN (SELECT b.bId FROM scBookmarks b, scCategories c WHERE b.bId = c.bId AND c.category = 'semweb')
GROUP BY b.bId
HAVING COUNT( b.bId ) =2
HAVING COUNT를 생략하면“bookmark | webservice-semweb”에 대한 쿼리가 표시됩니다.
"Toxi"솔루션
Toxi 는 3 개의 테이블 구조를 생각해 냈습니다. 테이블 "태그 맵"을 통해 북마크와 태그는 n-to-m 관련됩니다. 각 태그는 서로 다른 북마크와 함께 사용할 수 있으며 그 반대의 경우도 마찬가지입니다. 이 DB 스키마는 워드 프레스에서도 사용됩니다. 쿼리는 "scuttle"솔루션에서와 매우 동일합니다.
“bookmark + webservice + semweb”에 대한 교차 (AND) 쿼리
SELECT b.*
FROM tagmap bt, bookmark b, tag t
WHERE bt.tag_id = t.tag_id
AND (t.name IN ('bookmark', 'webservice', 'semweb'))
AND b.id = bt.bookmark_id
GROUP BY b.id
HAVING COUNT( b.id )=3
"bookmark | webservice | semweb"에 대한 통합 (OR) 쿼리
SELECT b.*
FROM tagmap bt, bookmark b, tag t
WHERE bt.tag_id = t.tag_id
AND (t.name IN ('bookmark', 'webservice', 'semweb'))
AND b.id = bt.bookmark_id
GROUP BY b.id
마이너스 (제외) "bookmark + webservice-semweb"쿼리, 즉 semweb이 아니라 북마크 및 웹 서비스입니다.
SELECT b. *
FROM bookmark b, tagmap bt, tag t
WHERE b.id = bt.bookmark_id
AND bt.tag_id = t.tag_id
AND (t.name IN ('Programming', 'Algorithms'))
AND b.id NOT IN (SELECT b.id FROM bookmark b, tagmap bt, tag t WHERE b.id = bt.bookmark_id AND bt.tag_id = t.tag_id AND t.name = 'Python')
GROUP BY b.id
HAVING COUNT( b.id ) =2
HAVING COUNT를 생략하면“bookmark | webservice-semweb”에 대한 쿼리가 표시됩니다.