यह सवाल है कि मुझे एक डेटाबेस को कैसे डिज़ाइन करना चाहिए, यह रिलेशनल / नॉस्कल डेटाबेस हो सकता है, जो बेहतर समाधान होगा
एक आवश्यकता को देखते हुए आपको एक ऐसी प्रणाली बनाने की आवश्यकता होगी जिसमें "कंपनी" और "उपयोगकर्ता" को ट्रैक करने के लिए एक डेटाबेस शामिल होगा। एक एकल उपयोगकर्ता हमेशा केवल एक कंपनी से संबंधित होता है
- एक उपयोगकर्ता केवल एक कंपनी से संबंधित हो सकता है
- एक कंपनी में कई उपयोगकर्ता हो सकते हैं
"कंपनी" तालिका के लिए डिज़ाइन काफी सीधा है। कंपनी के निम्नलिखित गुण / कॉलम होंगे: (इसे सरल रखें)
ID, COMPANY_NAME, CREATED_ON
पहला परिदृश्य
सरल और सीधे आगे, सभी उपयोगकर्ताओं के पास एक ही विशेषता है, इसलिए यह आसानी से संबंधपरक शैली, उपयोगकर्ता तालिका में किया जा सकता है:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CREATED_ON
दूसरा परिदृश्य
यदि विभिन्न कंपनियां अपने उपयोगकर्ता के लिए अलग प्रोफ़ाइल विशेषता संग्रहीत करना चाहती हैं तो क्या होगा। प्रत्येक कंपनी में विशेषताओं का एक निर्धारित समूह होगा जो उस कंपनी के सभी उपयोगकर्ताओं पर लागू होगा।
उदाहरण के लिए:
- कंपनी A स्टोर करना चाहती है: LIKE_MOVIE (बूलियन), LIKE_MUSIC (बूलियन)
- कंपनी B स्टोर करना चाहती है: FAV_CUISINE (स्ट्रिंग)
- कंपनी C स्टोर करना चाहती है: OWN_DOG (बूलियन), DOG_COUNT (int)
दृष्टिकोण १
जानवर बल तरीका उपयोगकर्ता के लिए एक एकल स्कीमा है और जब कंपनी से संबंधित न हों तो उन्हें नल दें।
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, LIKE_MOVIE, LIKE_MUSIC, FAV_CUISINE, OWN_DOG, DOG_COUNT, CREATED_ON
जो थोड़े बुरा है क्योंकि आप बहुत से NULLS और उपयोगकर्ता पंक्तियों के साथ समाप्त हो जाएंगे, जिनमें ऐसे स्तंभ हैं जो उनके लिए अप्रासंगिक हैं (यानी कंपनी A से संबंधित सभी उपयोगकर्ताओं के पास FAV_CUISINE, OWN_DOG, DOG_COUNT के लिए NULL मान हैं)
दृष्टिकोण २
एक दूसरा तरीका है, "फ्री फॉर्म फील्ड":
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_1, CUSTOM_2, CUSTOM_3, CREATED_ON
जो अपने आप में गंदा होगा क्योंकि आपको पता नहीं है कि कस्टम फ़ील्ड क्या हैं, डेटा प्रकार संग्रहीत मूल्यों के परावर्तक नहीं होगा (उदाहरण के लिए हम VARCHAR के रूप में इंट्यू वैल्यू स्टोर करेंगे)।
दृष्टिकोण ३
मैंने PostgreSQL JSON फ़ील्ड में देखा है, जिस स्थिति में आपके पास होगा:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_PROFILE_JSON, CREATED_ON
इस स्थिति में, आप किसी उपयोगकर्ता के लिए अलग स्कीमा कैसे लागू कर पाएंगे? कंपनी A के उपयोगकर्ता के पास ऐसा स्कीमा होगा जो दिखता है
{"LIKE_MOVIE":"boolean", "LIKE_MUSIC": "boolean"}
जबकि कंपनी C के साथ एक उपयोगकर्ता के पास एक अलग स्कीमा होगा:
{"OWN_DOG ":"boolean", "DOG_COUNT": "int"}
मुझे इस मुद्दे को कैसे हल करना चाहिए? मैं इस लचीली स्कीमा के लिए एक एकल "ऑब्जेक्ट" (उपयोगकर्ता) के लिए अनुमति देने के लिए डेटाबेस को ठीक से कैसे डिज़ाइन कर सकता हूं जो उनके (कंपनी) संबंधों के आधार पर है?
संबंधपरक समाधान? nosql समाधान?
संपादित करें: मैंने "CUSTOM_PROFILE" तालिका के बारे में भी सोचा है जो अनिवार्य रूप से कॉलम के बजाय पंक्तियों में उपयोगकर्ता विशेषताओं को संग्रहीत करेगा।
इस दृष्टिकोण के साथ 2 समस्याएं हैं:
1) डेटा कॉलम के बजाय पंक्तियों के रूप में प्रति उपयोगकर्ता बढ़ता है - और इसका मतलब है कि उपयोगकर्ता की पूरी तस्वीर प्राप्त करने के लिए, बहुत सारे जुड़ने की आवश्यकता होती है, कई अलग-अलग कस्टम विशेषताओं पर "कस्टम प्रोफ़ाइल" तालिका में शामिल होते हैं।
2) डेटा मूल्य हमेशा सामान्य होने के लिए VARCHAR के रूप में संग्रहीत किया जाता है, भले ही हमें पता हो कि डेटा को पूर्णांक या बूलियन आदि माना जाता है।