Mysql डेटाबेस डिजाइन - आवश्यक पैटर्न की पहचान

Aug 17 2020

मैं यह पता लगाने की कोशिश कर रहा हूं कि क्लब सदस्यता प्रबंधन प्रणाली के लिए डेटाबेस डिजाइन करते समय मैं किस पैटर्न (यदि कोई हो) की समस्या का वर्णन कर सकता हूं। मुझे पैटर्न की पहचान करने में सहायता की आवश्यकता है (यदि कोई मौजूद है) या कुछ संकेत देने के लिए मुझे किन-किन बिंदुओं पर विचार करने की आवश्यकता है।

सदस्य एक मुख्य इकाई हैं, कुछ जानकारी जैसे कि उन पर संपर्क विवरण। सदस्यों के क्लब में केंद्रीय कार्य हो सकते हैं, अर्थात कोषाध्यक्ष या कमोडोर आदि हो सकते हैं।

क्लब के शीर्ष स्तर के पदानुक्रम को मॉडल करने के लिए, मेरे पास सदस्यों से आईडी, एक संसेचन तालिका "बोर्डमेम्बरटेप्स" और "बोर्डमेम्बर्सटाइप" दोनों को जोड़ने वाली तालिका होगी।

हालाँकि, क्लब में उप-समूह भी हैं, प्रत्येक की अपनी पदानुक्रम संरचना है।

प्रत्येक सदस्य उपसमूह भूमिका "सदस्य" और "सक्रिय" या "निष्क्रिय" जैसे सदस्यता प्रकार के साथ कम से कम एक उपसमूह का हिस्सा है।

इनमें से प्रत्येक संरचना में कुछ समान और कुछ विशिष्ट भूमिकाएँ हैं। उदाहरण के तौर पे:

  • सबग्रुप A में समान सूची से कुर्सी, वाइस चेयर, कोषाध्यक्ष और सबग्रुप A पर लागू सूची से "सबग्रुप A टेक्नोलॉजी चेयर" है।
  • उपसमूह बी में एक अध्यक्ष, एक कोषाध्यक्ष और "विशिष्ट उपसमूह बी 1" और "विशिष्ट उपसमूह" 2 "भूमिका है।
  • सबगौप सी में केवल एक कुर्सी और "विशिष्ट उपसमूह सी" भूमिका हो सकती है।

उपसमूह जटिल बिट हैं:

Enumeration Table "Subgroup" (ID, Name)
Enumeration Table "MembershipType" (ID, Name)
Enumeration Table "MembershipFunction" (ID, Name)

पहली बाधा: व्यवस्थापन इंटरफ़ेस प्रस्तुत करते समय, मुझे उपसमूह के आधार पर सदस्यता के लिए बाध्य करने की आवश्यकता होगी। मुझे लगता है कि यह एक लिंक तालिका के माध्यम से प्राप्त किया जा सकता है:

 SubgroupMembershipFunctions (Id, SubgroupId, MembershipFunctionId)
 e.g. (Name output after applying joins obviously)

1    Subgroup A    Member
2    Subgroup A    Chairman
3    Subgroup A    Subgroup A Technology Chair
4    Subgroup B    Member
5    Subgroup B    Chairman
6    Subgroup B    Specific Subgroup B 1

सिद्धांत रूप में, मैं अब एक टेबल बना सकता हूं "मेंबर्ससमूहसमूहमशीनशिपफैक्शंस" मेम्बर्स के साथ, सबग्रुपमेम्बरशिपफ्रीक्शन्सआईड

इस बिंदु पर, मैं अभी भी सदस्यता (सक्रिय, निष्क्रिय) को स्टोर करने के लिए योग्य नहीं हूं, जो केवल "सदस्य" प्रविष्टि पर लागू होता है। अंतिम परिणाम मुझे कुछ इस तरह की आवश्यकता होगी

User          Subgroup    Type        Status
Justin Case   A           member      active
Justin Case   A           chairman    null(?)
Justin Case   B           member      passive
Justin Case   B           B 1         null(?)
Joe Bloggs    A           member      active
Jane Doe      B           member      active
Jane Doe      C           member      passive
Jane Doe      C           vicechair   null(?)

इस डिज़ाइन को बेहतर बनाने की दिशा में किसी भी मदद, सूचक या विचार की बहुत सराहना की जाती है।

जवाब

1 bbaird Aug 17 2020 at 22:54

मुझे नहीं पता कि क्या "ठीक से सामान्य करने" से परे एक डिज़ाइन पैटर्न है, लेकिन मुझे नहीं लगता कि आप एक व्यावहारिक समाधान से बहुत दूर हैं।

आपके विवरण को देखते हुए मुझे एक Subgroupइकाई की आवश्यकता नहीं दिखती है - हम Groupsउनमें से किसी एक को "द बोर्ड" कह सकते हैं ।

विशिष्ट के लिए GroupFunctions, हम उन लोगों के लिए एक विशेष मामला मानते हैं GroupMembers, यानी एक बार जब किसी को एक समूह को सौंपा जाता है, तो उन्हें जूनियर उपाध्यक्ष / आदि को अध्यक्ष / उपाध्यक्ष / विशेष सहायक सौंपा जा सकता है। प्रत्येक GroupFunctionको अधिकतम एक पर सौंपा जा सकता है GroupMember

सक्रिय / निष्क्रिय / आदि के लिए। पूरी तरह से Memberऔर प्रत्येक के लिए अलग-अलग स्तरों के लिए एक स्तर होना संभव है Group, लेकिन यदि "निष्क्रिय" सदस्य एक समूह का "सक्रिय" सदस्य नहीं हो सकता है, तो आपको कुछ लेनदेन तर्क की आवश्यकता हो सकती है। वैकल्पिक रूप से, आप उन समूहों के आधार पर MembershipTypeप्रत्येक के लिए प्राप्त कर सकते हैं Memberजिनके वे सदस्य हैं।

मैं आपके लिए डेटाटाइप और पूर्ण DDL छोड़ दूंगा (ऑडिट टेबल सहित), लेकिन यह काम करना चाहिए:

CREATE TABLE MembershipType
(
  MembershipTypeCd
 ,Name
 ,CONSTRAINT PK_MembershipType PRIMARY KEY (MembershipTypeCd)
 ,CONSTRAINT AK_MembershipType UNIQUE (Name)

);

CREATE TABLE Member
(
  MemberId
 ,MembershipTypeCd
 ,CONSTRAINT FK_Member_Has_MembershipType FOREIGN KEY (MembershipTypeCd) REFERENCES MembershipType (MembershipTypeCd)
 ,CONSTRAINT PK_Member PRIMARY KEY (MemberId)
);

CREATE TABLE MemberFunction
(
  FunctionShortName
 ,Name
 ,CONSTRAINT PK_MemberFunction PRIMARY KEY (FunctionShortName)
 ,CONSTRAINT AK_MemberFunction UNIQUE (Name)
);

CREATE TABLE Group /* A reserved keyword in most DBMS - may make sense to rename */
(
  GroupId
 ,Name
 ,CONSTRAINT PK_Group PRIMARY KEY (GroupId)
 ,CONSTRAINT AK_Group UNIQUE (Name)
);


CREATE TABLE GroupMember
(
  GroupId
 ,MemberId
 ,GroupMembershipTypeCd
 ,CONSTRAINT FK_GroupMember_Member_Of_Group FOREIGN KEY (GroupId) REFERENCES Group (GroupId)
 ,CONSTRAINT FK_GroupMember_Is_Member FOREIGN KEY (MemberId) REFERENCES Member (MemberId)
 ,CONSTRAINT FK_GroupMember_Has_MembershipType FOREIGN KEY (GroupMembershipTypeCd) REFERENCES MembershipType (MembershipTypeCd)
 ,CONSTRAINT PK_GroupMember PRIMARY KEY (GroupId, MemberId)
 ,CONSTRAINT AK_GroupMember UNIQUE (MemberId, GroupId)
)
;

CREATE TABLE GroupFunction
(
  GroupId
 ,FunctionShortName
 ,CONSTRAINT FK_GroupFunction_Available_For_Group FOREIGN KEY (GroupId) REFERENCES Group (GroupId)
 ,CONSTRAINT FK_GroupFunction_Is_MemberFunction FOREIGN KEY (FunctionShortName) REFERENCES MemberFunction (FunctionShortName)
 ,CONSTRAINT PK_GroupFunction PRIMARY KEY (GroupId, FunctionShortName)
);

CREATE TABLE GroupFunctionAssignment
(
  GroupId
 ,FunctionShortName
 ,MemberId
 ,CONSTRAINT FK_GroupFunctionAssignment_Assigned_To_GroupMember FOREIGN KEY (GroupId, MemberId) REFERENCES GroupMember (GroupId, MemberId)
 ,CONSTRAINT FK_GroupFunctionAssignment_Assigment_Of_GroupFunction FOREIGN KEY (GroupId, FunctionShortName) REFERENCES GroupFunction (GroupId, FunctionShortName)
 ,CONSTRAINT PK_GroupFunctionAssignment PRIMARY KEY (GroupId, FunctionShortName)
);

चित्र आमतौर पर समझने में आसान होते हैं (यदि आप IDEF1X से अपरिचित हैं, तो इसे पढ़ें ):