Bu blog gönderisini ilginç bulacağınıza inanıyorum: Etiketler: Veritabanı şemaları
Sorun: Bir yer imini (veya bir blog gönderisini veya herhangi bir şeyi) istediğiniz kadar etiketle etiketleyebileceğiniz bir veritabanı şemasına sahip olmak istiyorsunuz. Daha sonra, yer imlerini etiketlerin birleşimi veya kesişimiyle sınırlamak için sorgular çalıştırmak istersiniz. Ayrıca bazı etiketleri arama sonucundan hariç tutmak (örneğin: eksi) istersiniz.
"MySQLicious" çözümü
Bu çözümde, şema sadece bir tabloya sahiptir, normalden arındırılmıştır. MySQLicious, del.icio.us verilerini bu yapıya sahip bir tabloya aktardığı için bu türe "MySQLicious çözüm" adı verilir.
Kesişim (VE) "arama + web hizmeti + semweb" için sorgu:
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
AND tags LIKE "%webservice%"
AND tags LIKE "%semweb%"
"Arama | web hizmeti | semweb" için Union (OR) Sorgusu:
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
OR tags LIKE "%webservice%"
OR tags LIKE "%semweb%"
Eksi "arama + webservice-semweb" için Sorgu
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
AND tags LIKE "%webservice%"
AND tags NOT LIKE "%semweb%"
"Scuttle" çözümü
Scuttle , verilerini iki tablo halinde düzenler. Bu "scCategories" tablosu "etiket" tablosudur ve "yer imi" tablosuna bir yabancı anahtarı vardır.
Kesişim (VE) "yer işareti + web hizmeti + semweb" için sorgu:
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
İlk olarak, etiketin "yer imi", "web hizmeti" veya "semweb" olduğu (c.category IN ("yer işareti", "webservice", "semweb")) tüm yer imi-etiket kombinasyonları aranır, ardından yalnızca aranan üç etiketin tümü dikkate alınır (SAYISI VAR (b.bId) = 3).
"Yer imi | webservice | semweb" için Union (OR) Sorgusu:
HAVING yan tümcesini atlayın ve sendika var:
SELECT b.*
FROM scBookmarks b, scCategories c
WHERE c.bId = b.bId
AND (c.category IN ('bookmark', 'webservice', 'semweb'))
GROUP BY b.bId
Eksi (Hariç Tutma) "yer imi + webservice-semweb" için Sorgu, yani: yer imi VE web hizmeti VE semweb DEĞİL.
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
SAYISI OLMAKTAN ayrılmak, "yer işareti | webservice-semweb" için Sorguya yol açar.
"Toxi" çözümü
Toxi , üç masalı bir yapı buldu. Tablo "etiket eşleme" aracılığıyla yer imleri ve etiketler n'den m'ye ilişkilidir. Her etiket farklı yer imleriyle birlikte kullanılabilir ve bunun tersi de geçerlidir. Bu DB şeması aynı zamanda wordpress tarafından da kullanılmaktadır. Sorgular, "scuttle" çözümüyle tamamen aynı.
Kesişim (VE) "yer işareti + web hizmeti + semweb" için sorgu
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
"Yer işareti | webservice | semweb" için Union (OR) Sorgusu
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
Eksi (Hariç Tutma) "yer imi + webservice-semweb" için Sorgu, yani: yer imi VE web hizmeti VE semweb DEĞİL.
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
SAYISI OLMAKTAN ayrılmak, "yer işareti | webservice-semweb" için Sorguya yol açar.