Saya yakin Anda akan menemukan posting blog yang menarik ini: Tag: skema database
Masalah: Anda ingin memiliki skema database di mana Anda dapat menandai bookmark (atau posting blog atau apa pun) dengan tag sebanyak yang Anda inginkan. Kemudian, Anda ingin menjalankan kueri untuk membatasi bookmark ke gabungan atau persimpangan tag. Anda juga ingin mengecualikan (katakanlah: minus) beberapa tag dari hasil pencarian.
Solusi "MySQLicious"
Dalam solusi ini, skema hanya memiliki satu tabel, itu dinormalisasi. Jenis ini disebut "solusi MySQLicious" karena MySQLicious mengimpor data del.icio.us ke dalam tabel dengan struktur ini.
Intersection (AND) Query untuk “search + webservice + semweb”:
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
AND tags LIKE "%webservice%"
AND tags LIKE "%semweb%"
Kueri Union (OR) untuk “search | webservice | semweb”:
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
OR tags LIKE "%webservice%"
OR tags LIKE "%semweb%"
Minus Query untuk "search + webservice-semweb"
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
AND tags LIKE "%webservice%"
AND tags NOT LIKE "%semweb%"
Solusi "Scuttle"
Scuttle mengatur datanya dalam dua tabel. Tabel "scCategories" adalah "tag" -tabel dan memiliki kunci asing ke "bookmark" -tabel.
Intersection (AND) Query untuk "bookmark + 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
Pertama, semua kombinasi bookmark-tag dicari, di mana tag-nya adalah "bookmark", "webservice" atau "semweb" (c.category IN ('bookmark', 'webservice', 'semweb')), lalu hanya bookmark yang sudah mendapatkan ketiga tag yang dicari diperhitungkan (HAVING COUNT (b.bId) = 3).
Union (OR) Query untuk “bookmark | webservice | semweb”:
Tinggalkan klausa HAVING dan Anda memiliki 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 (Exclusion) Query untuk “bookmark + webservice-semweb”, yaitu: bookmark AND webservice AND NOT 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
Meninggalkan HAVING COUNT mengarah ke Query untuk “bookmark | webservice-semweb”.
Solusi "Toxi"
Toxi membuat struktur tiga meja. Melalui tabel "tagmap", bookmark dan tag terkait n-to-m. Setiap tag dapat digunakan bersama dengan bookmark yang berbeda dan sebaliknya. Skema DB ini juga digunakan oleh wordpress. Kueri cukup sama seperti pada solusi "scuttle".
Intersection (AND) Query untuk "bookmark + 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
Kueri Union (OR) untuk “bookmark | 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 (Exclusion) Query untuk “bookmark + webservice-semweb”, yaitu: bookmark AND webservice AND NOT 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
Meninggalkan HAVING COUNT mengarah ke Query untuk “bookmark | webservice-semweb”.