วิธีที่มีประสิทธิภาพที่สุดในการจัดเก็บแท็กในฐานข้อมูลคืออะไร?


138

ฉันกำลังใช้ระบบติดแท็กบนเว็บไซต์ของฉันคล้ายกับการใช้สแต็คโอเวอร์โฟลว์หนึ่งคำถามของฉันคืออะไรวิธีที่มีประสิทธิภาพมากที่สุดในการจัดเก็บแท็กเพื่อให้สามารถค้นหาและกรองได้อย่างไร

ความคิดของฉันคือ:

Table: Items
Columns: Item_ID, Title, Content

Table: Tags
Columns: Title, Item_ID

ช้าเกินไปหรือไม่ มีวิธีที่ดีกว่า?


2
ถามก่อนหน้านี้: stackoverflow.com/questions/20856/…
DrBloodmoney

1
ในปี 2559 ใช้ Solr หรือ Elasticsearch
Charles L.

คำตอบ:


189

รายการหนึ่งจะมีแท็กมากมาย และหนึ่งแท็กจะเป็นของหลาย ๆ รายการ สิ่งนี้บอกเป็นนัยว่าคุณอาจต้องใช้ตารางตัวกลางในการเอาชนะอุปสรรคที่เกิดขึ้นมากมาย

สิ่งที่ต้องการ:

ตาราง:
คอลัมน์รายการ: Item_ID, Item_Title, เนื้อหา

ตาราง: แท็ก
คอลัมน์: Tag_ID, Tag_Title

ตาราง: Items_Tags
คอลัมน์: Item_ID, Tag_ID

อาจเป็นไปได้ว่าแอปพลิเคชันเว็บของคุณได้รับความนิยมอย่างบ้าคลั่งและต้องการลดความผิดปกติลงบนท้องถนน


ที่เกี่ยวข้อง: stackoverflow.com/questions/20856/…
Cherian

หากมีบางอย่างเช่น tagGroup วิธีจัดการเช่นแท็กจะถูกจัดกลุ่มเป็นหมวดหมู่เช่น: ภาษาการเขียนโปรแกรม: c #, vb, pearl ระบบปฏิบัติการ: windows7, dos, linux และอื่น ๆ
Thunder

4
@Thunder: สมมติว่าหนึ่งแท็กอาจอยู่ในหมวดหมู่เดียวเท่านั้นฉันจะสร้างตาราง TagCategory ซึ่งประกอบด้วย category_id และ category_name จากนั้นฉันจะผนวกฟิลด์ category_id ไว้ที่ตาราง Tags และทำการเข้าร่วมนั้น
Simon Scarfe

114

คุณควรอ่านบล็อกของ Philipp Keller เกี่ยวกับการติดแท็กสกีมาฐานข้อมูล เขาพยายามไม่กี่และรายงานผลของเขาทั้งในแง่ของความสะดวกในการสร้างแบบสอบถามทั่วไปและในแง่ของประสิทธิภาพ จำนวนของแท็กจำนวนของรายการที่ติดแท็กและจำนวนแท็กต่อรายการเป็นปัจจัยทั้งหมด โพสต์มาจากปี 2005; ฉันไม่ได้ตระหนักถึงการปรับปรุงใด ๆ ตั้งแต่นั้นมา


19
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุด มันขึ้นอยู่กับการทดสอบจริงและการวิจัยมากกว่า suppositions ชอบคำตอบอื่น ๆ ส่วนใหญ่
Cristian Vrabie

4
ดูเหมือนว่าลิงก์ในคำตอบจะใช้งานไม่ได้ พบสำเนาที่vtidter.blogspot.be/2014/02/database-schema-for-tags.html
Christophe Herreman

8

ที่จริงแล้วฉันเชื่อว่าการลดขนาดแท็กตารางอาจเป็นวิธีที่ดีกว่าไปข้างหน้าขึ้นอยู่กับขนาด

ด้วยวิธีนี้ตารางแท็กก็มี tagid, itemid, tagname

คุณจะได้รับ tagnames ซ้ำ แต่มันทำให้การเพิ่ม / ลบ / แก้ไขแท็กสำหรับรายการที่เฉพาะเจาะจงมากขึ้นง่ายขึ้น คุณไม่จำเป็นต้องสร้างแท็กใหม่ลบการจัดสรรแท็กเก่าออกและจัดสรรแท็กใหม่อีกครั้งคุณเพียงแค่แก้ไขชื่อแท็ก

สำหรับการแสดงรายการแท็กคุณเพียงแค่ใช้ DISTINCT หรือ GROUP BY และแน่นอนคุณสามารถนับจำนวนแท็กที่ใช้งานได้ง่ายเช่นกัน


4

หากคุณไม่คำนึงถึงการใช้สิ่งที่ไม่ได้มาตรฐานบิต Postgres เวอร์ชัน 9.4 ขึ้นไปมีตัวเลือกในการจัดเก็บเร็กคอร์ดของอาร์เรย์ข้อความ JSON ชนิด

สคีมาของคุณคือ:

Table: Items
Columns: Item_ID:int, Title:text, Content:text

Table: Tags
Columns: Item_ID:int, Tag_Title:text[]

สำหรับข้อมูลเพิ่มเติมดูโพสต์ที่ยอดเยี่ยมนี้โดย Josh Berkus: http://www.databasesoup.com/2015/01/tag-all-things.html

มีตัวเลือกที่หลากหลายกว่าเมื่อเปรียบเทียบอย่างละเอียดสำหรับประสิทธิภาพและตัวเลือกที่แนะนำด้านบนคือภาพรวมที่ดีที่สุด


2

ฉันขอแนะนำให้ใช้ตารางที่สามสำหรับการจัดเก็บแท็ก <=> การเชื่อมโยงรายการเนื่องจากเรามีความสัมพันธ์แบบหลายต่อหลายอย่างระหว่างแท็กและรายการนั่นคือรายการหนึ่งสามารถเชื่อมโยงกับหลายแท็กและแท็กหนึ่งรายการสามารถเชื่อมโยงกับหลายรายการ HTH วาล์ว


1

คุณไม่สามารถพูดคุยเกี่ยวกับความเชื่องช้าจริง ๆ ตามข้อมูลที่คุณให้ไว้ในคำถาม และฉันไม่คิดว่าคุณควรกังวลมากเกินไปเกี่ยวกับประสิทธิภาพในขั้นตอนของการพัฒนานี้ มันเรียกว่าการเพิ่มประสิทธิภาพก่อนวัยอันควรการเพิ่มประสิทธิภาพก่อนวัยอันควร

อย่างไรก็ตามฉันขอแนะนำให้คุณรวมคอลัมน์ Tag_ID ไว้ในตารางแท็ก โดยปกติแล้วเป็นวิธีปฏิบัติที่ดีที่ทุกตารางมีคอลัมน์ ID


1

หากพื้นที่ว่างจะเป็นปัญหาให้มีแท็กตารางที่ 3 (Tag_Id, ชื่อเรื่อง) เพื่อเก็บข้อความสำหรับแท็กแล้วเปลี่ยนตารางแท็กของคุณให้เป็น (Tag_Id, Item_Id) ค่าทั้งสองนั้นควรให้คีย์หลักแบบผสมที่ไม่ซ้ำใคร


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.