मैं जानबूझकर इस अस्पष्ट को पहले छोड़ रहा हूं। मैं चर्चा की तलाश में हूं और कठोर उत्तरों की तलाश में मुझे कौन से मुद्दे महत्वपूर्ण हैं।
मैं एक ऐप डिजाइन करने के बीच में हूं जो पोर्टफोलियो प्रबंधन की तरह कुछ करता है। मेरे पास अब तक का डिज़ाइन है
- Problem: a problem that needs to be solved
- Solution: a proposed solution to one or more problems
- Relationship: a relationship among two problems, two solutions, or a problem and a solution. Further broken down into:
- Parent-child - some sort of categorization/tree hierarchy
- Overlap - the degree to which two solutions or two problems really address the same concept
- Addresses - the degree to which a problem addresses a solution
मेरा सवाल इन चीजों की अस्थायी प्रकृति के बारे में है। समस्याएं फसल, फिर फीका। समाधानों की अपेक्षाकृत संकल्प दिनांक है, लेकिन इसे विकसित किए जाने के रूप में संशोधित किया जा सकता है। एक रिश्ते की डिग्री समय के साथ बदल सकती है क्योंकि समस्याएं और समाधान विकसित होते हैं।
तो, सवाल: इन चीजों के संस्करण के लिए सबसे अच्छा डिजाइन क्या है, इसलिए मैं अपने पोर्टफोलियो का वर्तमान और ऐतिहासिक परिप्रेक्ष्य दोनों प्राप्त कर सकता हूं?
बाद में: शायद मुझे इसे एक और विशिष्ट सवाल बनाना चाहिए, हालांकि @ एरिक दाढ़ी का जवाब एक लायक है।
मैंने तीन डेटाबेस डिज़ाइनों पर विचार किया है। मैं अपनी कमियों को दिखाने के लिए प्रत्येक के लिए पर्याप्त होगा। मेरा सवाल है: कौन सा चुनना है, या आप कुछ बेहतर सोच सकते हैं?
1: समस्याएं (और अलग से, समाधान) संस्करण में आत्म-संदर्भित हैं।
table problems
int id | string name | text description | datetime created_at | int previous_version_id
foreign key previous_version_id -> problems.id
यह समस्याग्रस्त है क्योंकि हर बार जब मैं एक नया संस्करण चाहता हूं, तो मुझे उस पूरे विवरण
कॉलम सहित पूरी पंक्ति को डुप्लिकेट करना होगा।
2: एक नया रिश्ता प्रकार बनाएँ: संस्करण।
table problems
int id | string name | text description | datetime created_at
यह रिश्ते तालिका में समस्याएं और समाधान तालिकाओं से रिश्ते को स्थानांतरित करता है। वही डुप्लिकेशन समस्या, लेकिन शायद थोड़ा "क्लीनर" क्योंकि मेरे पास पहले से ही एक अमूर्त रिलेशनशिप अवधारणा है।
3: एक और सबवर्सन-जैसी संरचना का उपयोग करें; सभी समस्या और समाधान विशेषताओं को एक अलग तालिका में ले जाएं और उन्हें संस्करण दें।
table problems
int id
table attributes
int id | int thing_id | string thing_type | string name | string value | datetime created_at | int previous_version_id
foreign key (thing_id, thing_type) -> problems.id or solutions.id
foreign key previous_version_id -> attributes.id
इसका मतलब है कि किसी समस्या या समाधान के वर्तमान संस्करण को लोड करने के लिए मुझे विशेषता के सभी संस्करणों को लाने के लिए, उन्हें तिथि के अनुसार क्रमबद्ध करें और फिर सबसे वर्तमान का उपयोग करें। यह भयानक नहीं हो सकता है। मेरे लिए वास्तव में बुरा लगता है कि मैं डेटाबेस में इन विशेषताओं को टाइप-चेक नहीं कर सकता। वह मान
कॉलम फ्री-टेक्स्ट होना चाहिए। मैं name
कॉलम को एक अलग attribute_names
तालिका में एक संदर्भ बना सकता हूं जिसमें type
कॉलम है, लेकिन यह बल नहीं विशेषताएँ
तालिका में सही प्रकार।
बाद में अभी भी: बहु-टेबल विदेशी कुंजी के बारे में @Eric Beard की टिप्पणियों के जवाब:
हां, मैंने जो वर्णन किया है वह सरल है: केवल दो प्रकार की चीजें हैं (समस्याएं और समाधान)। मेरे पास वास्तव में लगभग 9 या 10 विभिन्न प्रकार की चीजें हैं, इसलिए आपकी रणनीति के तहत मेरे पास 9 या 10 कॉलम विदेशी कुंजी होंगे। मैं सिंगल-टेबल विरासत का उपयोग करना चाहता था, लेकिन चीजों में इतनी कम आम बात है कि यह बेहद एक टेबल में गठबंधन करने के लिए अपर्याप्त होगा।