โดยปกติฉันจะเห็นด้วยกับยาคอฟเอลลิส แต่ในกรณีพิเศษนี้มีวิธีแก้ไขปัญหาอื่นที่ใช้งานได้:
ใช้สองตาราง:
Table: Item
Columns: ItemID, Title, Content
Indexes: ItemID
Table: Tag
Columns: ItemID, Title
Indexes: ItemId, Title
นี่มีข้อดีที่สำคัญบางประการ:
ก่อนอื่นมันทำให้การพัฒนาง่ายขึ้นมาก: ในโซลูชันสามตารางสำหรับการแทรกและอัปเดตitem
คุณต้องค้นหาTag
ตารางเพื่อดูว่ามีรายการอยู่แล้วหรือไม่ จากนั้นคุณต้องเข้าร่วมกับพวกเขาใหม่ นี่ไม่ใช่งานที่ไม่สำคัญ
จากนั้นทำให้ข้อความค้นหาง่ายขึ้น (และอาจเร็วกว่า) มีเคียวรีฐานข้อมูลหลักสามข้อที่คุณจะทำ: เอาท์พุททั้งหมดTags
สำหรับหนึ่งItem
, วาด Tag-Cloud และเลือกรายการทั้งหมดสำหรับหนึ่งชื่อแท็ก
แท็กทั้งหมดสำหรับหนึ่งรายการ:
ตารางที่ 3:
SELECT Tag.Title
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
WHERE ItemTag.ItemID = :id
2 ตาราง:
SELECT Tag.Title
FROM Tag
WHERE Tag.ItemID = :id
แท็กเมฆ:
ตารางที่ 3:
SELECT Tag.Title, count(*)
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
GROUP BY Tag.Title
2 ตาราง:
SELECT Tag.Title, count(*)
FROM Tag
GROUP BY Tag.Title
รายการสำหรับหนึ่งแท็ก:
ตารางที่ 3:
SELECT Item.*
FROM Item
JOIN ItemTag ON Item.ItemID = ItemTag.ItemID
JOIN Tag ON ItemTag.TagID = Tag.TagID
WHERE Tag.Title = :title
2 ตาราง:
SELECT Item.*
FROM Item
JOIN Tag ON Item.ItemID = Tag.ItemID
WHERE Tag.Title = :title
แต่มีข้อเสียบางประการเช่นกัน: อาจใช้พื้นที่มากขึ้นในฐานข้อมูล (ซึ่งอาจนำไปสู่การทำงานของดิสก์ที่ช้ากว่ามาก) และไม่ได้ทำให้เป็นมาตรฐานซึ่งอาจนำไปสู่ความไม่สอดคล้องกัน
อาร์กิวเมนต์ขนาดไม่แข็งแรงเพราะธรรมชาติของแท็กคือโดยทั่วไปแล้วมันจะค่อนข้างเล็กดังนั้นการเพิ่มขนาดจะไม่ใหญ่ อาจมีการยืนยันว่าการสืบค้นชื่อแท็กนั้นเร็วกว่ามากในตารางเล็ก ๆ ที่มีแท็กแต่ละแท็กเพียงครั้งเดียวและนี่เป็นเรื่องจริง แต่การคำนึงถึงการออมที่ไม่ต้องเข้าร่วมและความจริงที่ว่าคุณสามารถสร้างดัชนีที่ดีให้พวกเขาสามารถชดเชยสิ่งนี้ได้อย่างง่ายดาย หลักสูตรนี้ขึ้นอยู่กับขนาดของฐานข้อมูลที่คุณใช้เป็นอย่างมาก
อาร์กิวเมนต์ที่ไม่สอดคล้องกันก็เป็นสิ่งที่สงสัยเช่นกัน แท็กเป็นฟิลด์ข้อความอิสระและไม่มีการดำเนินการตามที่คาดไว้เช่น 'เปลี่ยนชื่อแท็กทั้งหมด "foo" เป็น "bar" "
tldr ดังนั้น: ฉันจะไปแก้ปัญหาสองตาราง (อันที่จริงฉันกำลังจะไปฉันพบบทความนี้เพื่อดูว่ามีข้อโต้แย้งที่ถูกต้องหรือไม่)