मैं एक सॉफ्टवेयर डेवलपर हूं। मुझे कोड से प्यार है, लेकिन मुझे डेटाबेस से नफरत है ... वर्तमान में, मैं एक वेबसाइट बना रहा हूं, जिस पर एक उपयोगकर्ता को पसंद के रूप में एक इकाई को चिह्नित करने की अनुमति दी जाएगी (जैसे एफबी में), इसे टैग करें और टिप्पणी करें ।
मैं इस कार्यक्षमता को संभालने के लिए डेटाबेस टेबल डिज़ाइन पर अटक जाता हूं। समाधान तुच्छ है, अगर हम ऐसा केवल एक ही प्रकार की चीज़ के लिए कर सकते हैं (जैसे। फोटो)। लेकिन मुझे इसे 5 अलग-अलग चीजों के लिए सक्षम करने की आवश्यकता है (अभी के लिए, लेकिन मैं यह भी मानता हूं कि यह संख्या बढ़ सकती है, क्योंकि पूरी सेवा बढ़ती है)।
मुझे यहां कुछ ऐसे ही सवाल मिले, लेकिन उनमें से किसी का भी संतोषजनक जवाब नहीं है, इसलिए मैं यह सवाल फिर से पूछ रहा हूं।
सवाल यह है कि डेटाबेस को ठीक से, कुशलतापूर्वक और शाब्दिक रूप से कैसे डिजाइन किया जाए, ताकि यह विभिन्न तालिकाओं के लिए टिप्पणियों को संग्रहीत कर सके , उनके लिए अलग-अलग तालिकाओं और टैग्स के लिए पसंद कर सके। उत्तर के रूप में कुछ डिजाइन पैटर्न सबसे अच्छा होगा;)
विस्तृत विवरण : मैं एक है तालिका User
3 और कुछ उपयोगकर्ता डेटा के साथ, और टेबल : Photo
के साथ तस्वीरें , Articles
साथ लेख , Places
साथ स्थानों । मैं किसी भी लॉग इन उपयोगकर्ता को सक्षम करना चाहता हूं:
उन 3 तालिकाओं में से किसी पर टिप्पणी करें
पसंद के अनुसार उनमें से किसी को चिह्नित करें
उनमें से किसी को किसी टैग के साथ टैग करें
मैं हर तत्व के लिए पसंद की संख्या और उस विशेष टैग का उपयोग करने की संख्या को भी गिनना चाहता हूं।
1 सेंट दृष्टिकोण :
एक) के लिए टैग , मैं एक बनाएगा तालिका Tag [TagId, tagName, tagCounter]
, तो मैं पैदा करेगा कई-से-अनेक रिश्तों तालिकाओं के लिए: Photo_has_tags
, Place_has_tag
, Article_has_tag
।
ख) टिप्पणियों के लिए एक ही मायने रखता है।
ग) मैं एक पैदा करेगा मेज LikedPhotos [idUser, idPhoto]
, LikedArticles[idUser, idArticle]
, LikedPlace [idUser, idPlace]
। पसंद की संख्या को प्रश्नों द्वारा गणना की जाएगी (जो, मुझे लगता है कि खराब है)। तथा...
मैं वास्तव में पिछले भाग के लिए इस डिजाइन को पसंद नहीं करता, यह मेरे लिए बुरी तरह से बदबू आ रही है;)
2 एन डी दृष्टिकोण :
मैं एक तालिका ElementType [idType, TypeName == some table name]
बनाऊंगा जिसे प्रशासक (मेरे) द्वारा उन तालिकाओं के नामों से आबाद किया जाएगा जिन्हें पसंद , टिप्पणी या टैग किया जा सकता है । फिर मैं टेबल बनाऊंगा :
a) 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
) तालिका - चुनिंदा गिनती () द्वारा।
मुझे उम्मीद है कि इस मुद्दे की मेरी व्याख्या अब अधिक गहन है।