ฉันเป็นนักพัฒนาซอฟต์แวร์ ฉันรักที่จะรหัส แต่ฉันเกลียดฐานข้อมูล ... ปัจจุบันฉันสร้างเว็บไซต์ที่ผู้ใช้จะได้รับอนุญาตให้ทำเครื่องหมายกิจการเป็นชอบ (เหมือนใน FB) แท็กมันและแสดงความคิดเห็น
ฉันติดอยู่กับการออกแบบตารางฐานข้อมูลสำหรับจัดการฟังก์ชันนี้ การแก้ปัญหาเป็นเรื่องไม่สำคัญหากเราสามารถทำสิ่งนี้ได้เพียงประเภทเดียวเท่านั้น (เช่นภาพถ่าย) แต่ฉันต้องเปิดใช้งานสิ่งนี้สำหรับ 5 สิ่งที่แตกต่างกัน (ตอนนี้ แต่ฉันยังคิดว่าจำนวนนี้สามารถเพิ่มขึ้นได้เช่นกันเมื่อการบริการทั้งหมดเพิ่มขึ้น)
ฉันพบคำถามที่คล้ายกันที่นี่ แต่ไม่มีคำตอบที่น่าพอใจดังนั้นฉันจึงถามคำถามนี้อีกครั้ง
คำถามคือวิธีการที่ถูกต้องได้อย่างมีประสิทธิภาพและยืดหยุ่นในการออกแบบฐานข้อมูลเพื่อที่จะสามารถเก็บความคิดเห็นแตกต่างกันสำหรับตาราง , ชอบแตกต่างกันสำหรับตารางและแท็กสำหรับพวกเขา รูปแบบการออกแบบบางคำตอบจะดีที่สุด;)
รายละเอียด : ฉันมีตาราง User
ที่มีข้อมูลของผู้ใช้บางส่วนและอีก 3 ตาราง : Photo
กับการถ่ายภาพ , Articles
กับบทความ , Places
กับสถานที่ ฉันต้องการเปิดใช้งานผู้ใช้ที่บันทึกไว้เพื่อ:
แสดงความคิดเห็นใด ๆ ใน 3 ตารางเหล่านั้น
ทำเครื่องหมายใด ๆ ของพวกเขาเป็นที่ชอบ
ติดแท็กใด ๆ ของพวกเขาด้วยแท็กบางอย่าง
ฉันต้องการนับจำนวนไลค์สำหรับทุกองค์ประกอบและจำนวนครั้งที่ใช้แท็กเฉพาะ
1 เซนต์วิธีการ :
a) สำหรับแท็กฉันจะสร้างตาราง Tag [TagId, tagName, tagCounter]
แล้วฉันจะสร้างหลายต่อหลายความสัมพันธ์ตารางสำหรับ: Photo_has_tags
, ,Place_has_tag
Article_has_tag
b) จำนวนเดียวกันสำหรับความคิดเห็น
c) ฉันจะสร้างตาราง LikedPhotos [idUser, idPhoto]
, ,LikedArticles[idUser, idArticle]
LikedPlace [idUser, idPlace]
จำนวนรายการที่ชอบจะถูกคำนวณโดยข้อความค้นหา (ซึ่งฉันถือว่าไม่ดี) และ...
ฉันไม่ชอบการออกแบบนี้ในส่วนสุดท้ายมีกลิ่นไม่ดีสำหรับฉัน;)
2 ครั้งวิธีการ :
ผมจะสร้างตารางElementType [idType, TypeName == some table name]
ซึ่งจะมีประชากรโดยผู้ดูแลระบบ (ฉัน) ที่มีชื่อของตารางที่สามารถชอบ , แสดงความคิดเห็นหรือแท็ก จากนั้นฉันจะสร้างตาราง :
ก) LikedElement [idLike, idUser, idElementType, idLikedElement]
และเช่นเดียวกันสำหรับความคิดเห็นและแท็กที่มีคอลัมน์ที่เหมาะสมสำหรับแต่ละรายการ ตอนนี้เมื่อฉันต้องการทำให้ภาพที่ชอบฉันจะแทรก:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)
และสำหรับสถานที่:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)
และอื่น ๆ ... ฉันคิดว่าวิธีที่สองนั้นดีกว่า แต่ฉันก็รู้สึกว่ามีบางอย่างขาดหายไปในการออกแบบนี้เช่นกัน ...
ในที่สุดฉันก็สงสัยว่าสถานที่ที่ดีที่สุดในการจัดเก็บเคาน์เตอร์สำหรับองค์ประกอบที่ชอบคือเท่าไหร่ ฉันนึกได้สองวิธีเท่านั้น:
- ในองค์ประกอบ (
Photo/Article/Place
) ตาราง - โดยเลือกจำนวน ()
ฉันหวังว่าคำอธิบายปัญหาของฉันจะละเอียดยิ่งขึ้นในขณะนี้