Ich glaube, Sie werden diesen Blog-Beitrag interessant finden: Tags: Datenbankschemata
Das Problem: Sie möchten ein Datenbankschema haben, in dem Sie ein Lesezeichen (oder einen Blog-Beitrag oder was auch immer) mit so vielen Tags versehen können, wie Sie möchten. Später möchten Sie Abfragen ausführen, um die Lesezeichen auf eine Vereinigung oder einen Schnittpunkt von Tags zu beschränken. Sie möchten auch einige Tags aus dem Suchergebnis ausschließen (z. B. minus).
"MySQLicious" -Lösung
In dieser Lösung hat das Schema nur eine Tabelle, es wird denormalisiert. Dieser Typ wird als "MySQLicious-Lösung" bezeichnet, da MySQLicious del.icio.us-Daten in eine Tabelle mit dieser Struktur importiert.
Schnittpunktabfrage (UND) für "Suche + Webservice + Semweb":
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
AND tags LIKE "%webservice%"
AND tags LIKE "%semweb%"
Union (OR) Abfrage nach "search | webservice | semweb":
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
OR tags LIKE "%webservice%"
OR tags LIKE "%semweb%"
Minus-Abfrage für "Suche + Webservice-Semweb"
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
AND tags LIKE "%webservice%"
AND tags NOT LIKE "%semweb%"
"Scuttle" -Lösung
Scuttle organisiert seine Daten in zwei Tabellen. Diese Tabelle "scCategories" ist die "Tag" -Tabelle und hat einen Fremdschlüssel für die "Lesezeichen" -Tabelle.
Schnittpunktabfrage (UND) für "Lesezeichen + Webservice + Semweb":
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
Zuerst werden alle Lesezeichen-Tag-Kombinationen durchsucht, wobei das Tag "Lesezeichen", "Webservice" oder "Semweb" ist (c.Kategorie IN ("Lesezeichen", "Webservice", "Semweb")), dann nur die Lesezeichen, die Alle drei Tags, nach denen gesucht wurde, werden berücksichtigt (HAVING COUNT (b.bId) = 3).
Union (OR) Abfrage für "bookmark | webservice | semweb":
Lassen Sie einfach die HAVING-Klausel weg und Sie haben union:
SELECT b.*
FROM scBookmarks b, scCategories c
WHERE c.bId = b.bId
AND (c.category IN ('bookmark', 'webservice', 'semweb'))
GROUP BY b.bId
Minus (Ausschluss) Abfrage für "Lesezeichen + Webservice-Semweb", dh: Lesezeichen UND Webservice UND NICHT 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
Das Weglassen des HAVING COUNT führt zur Abfrage für "bookmark | webservice-semweb".
"Toxi" -Lösung
Toxi entwickelte eine Struktur mit drei Tischen. Über die Tabelle "Tagmap" sind die Lesezeichen und die Tags n-zu-m-bezogen. Jedes Tag kann zusammen mit verschiedenen Lesezeichen verwendet werden und umgekehrt. Dieses DB-Schema wird auch von WordPress verwendet. Die Abfragen sind die gleichen wie bei der "scuttle" -Lösung.
Schnittpunktabfrage (UND) für "Lesezeichen + Webservice + Semweb"
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
Union (OR) Abfrage für "Lesezeichen | Webservice | Semweb"
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
Minus (Ausschluss) Abfrage für "Lesezeichen + Webservice-Semweb", dh: Lesezeichen UND Webservice UND NICHT 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
Das Weglassen des HAVING COUNT führt zur Abfrage für "bookmark | webservice-semweb".