ฉันเชื่อว่าคุณจะพบว่าโพสต์บล็อกนี้น่าสนใจ: แท็ก: สคีมาฐานข้อมูล
ปัญหา: คุณต้องการมีสคีมาฐานข้อมูลที่คุณสามารถแท็กบุ๊กมาร์ก (หรือโพสต์บล็อกหรืออะไรก็ได้) ด้วยแท็กได้มากเท่าที่คุณต้องการ หลังจากนั้นคุณต้องการเรียกใช้การสืบค้นเพื่อ จำกัด บุ๊กมาร์กให้รวมกันหรือตัดกันของแท็ก คุณยังต้องการยกเว้น (พูดว่า: ลบ) บางแท็กจากผลการค้นหา
โซลูชัน“ MySQLicious”
ในโซลูชันนี้สคีมามีเพียงตารางเดียวมันถูกทำให้เป็นปกติ ประเภทนี้เรียกว่า“ MySQLicious solution” เนื่องจาก MySQLicious นำเข้าข้อมูล del.icio.us ลงในตารางที่มีโครงสร้างนี้
จุดตัด (AND) คำค้นหาสำหรับ“ search + webservice + semweb”:
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
AND tags LIKE "%webservice%"
AND tags LIKE "%semweb%"
ยูเนี่ยน (OR) เคียวรีสำหรับ“ ค้นหา | บริการเว็บ | semweb”:
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
OR tags LIKE "%webservice%"
OR tags LIKE "%semweb%"
Minus Query สำหรับ "search + webservice-semweb"
SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
AND tags LIKE "%webservice%"
AND tags NOT LIKE "%semweb%"
โซลูชัน "Scuttle"
Scuttleจัดระเบียบข้อมูลเป็นสองตาราง ตารางนั้น“ scCategories” คือ“ แท็ก” - ตารางและมีคีย์นอกสำหรับ“ บุ๊กมาร์ก” - ตาราง
จุดตัด (AND) คำค้นหาสำหรับ“ 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
ขั้นแรกให้ค้นหาชุดค่าผสมบุ๊กมาร์ก - แท็กทั้งหมดโดยที่แท็กคือ "บุ๊กมาร์ก", "บริการเว็บ" หรือ "เซมเว็บ" (c.category IN ('bookmark', 'webservice', 'semweb')) จากนั้นก็แค่บุ๊กมาร์กที่ ได้รับทั้งสามแท็กที่ค้นหาถูกนำมาพิจารณา (HAVING COUNT (b.bId) = 3)
Union (OR) Query สำหรับ "bookmark | webservice | semweb":
เพียงแค่ละเว้น HAVING clause และคุณมี 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มาพร้อมกับโครงสร้างสามโต๊ะ ผ่านตาราง "tagmap" บุ๊กมาร์กและแท็กเกี่ยวข้องกันแบบ n-to-m แต่ละแท็กสามารถใช้ร่วมกับบุ๊กมาร์กที่แตกต่างกันและในทางกลับกัน DB-schema นี้ยังใช้โดย wordpress ข้อความค้นหาค่อนข้างเหมือนกับในโซลูชัน "scuttle"
จุดตัด (AND) คำค้นหาสำหรับ“ 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
ยูเนี่ยน (OR) การค้นหา "บุ๊กมาร์ก | เว็บบริการ | 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
เครื่องหมายลบ (การยกเว้น) ข้อความค้นหาสำหรับ "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"