Mysql 數據庫設計 - 辨識所需的模式
我試圖找出哪種模式(如果有)可以描述我在為俱樂部會員管理系統設計數據庫時所面臨的問題。我需要幫助來辨識模式(如果存在的話)或一些我需要考慮的指針,以便取得一些進展。
成員是一個主要實體,其中包含一些資訊,例如聯繫方式。會員可以在俱樂部擔任中心職能,即擔任司庫或準將等。
為了對俱樂部的頂級層次結構進行建模,我將擁有來自會員的 ID、一個列舉表“BoardMemberTypes”和一個連接兩者的“BoardMembersType”表。
然而,俱樂部也有小組,每個小組都有自己的等級結構。
每個成員都是至少一個子組的一部分,子組角色為“成員”,成員類型如“主動”或“被動”。
這些結構中的每一個都有一些相同的和一些特定的角色。舉個例子:
- 小組 A 有來自同一組的主席、副主席、財務主管,以及僅適用於小組 A 的列表中的“小組 A 技術主席”
- B 組有主席、司庫和“特定子組 B 1”和“特定子組 B 2”角色
- 子組 C 可能只有一個主席和一個“特定子組 C”角色。
子組是複雜的一點:
Enumeration Table "Subgroup" (ID, Name) Enumeration Table "MembershipType" (ID, Name) Enumeration Table "MembershipFunction" (ID, Name)
第一個障礙:在展示管理界面時,我需要根據子組來限制 MembershipFunction。我想這可以通過連結表來實現:
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
理論上,我現在可以使用 MembersID、SubgroupMembershipFunctionsId 創建一個表“MembersSubgroupMembershipFunctions”
在這一點上,我仍然缺乏儲存僅適用於“會員”條目的 MembershipType(主動、被動)的能力。我需要的最終結果可能是這樣的
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(?)
非常感謝任何有助於改進此設計的幫助、指針或想法。
我不知道是否存在“正確規範化”之外的設計模式,但我認為您離可行的解決方案並不太遠。
鑑於您的描述,我認為不需要
Subgroup
實體 - 我們可以只擁有Groups
其中一個並將其表示為“董事會”。具體來說
GroupFunctions
,我們會認為這些是 的特例GroupMembers
,即一旦有人被分配到一個小組,他們就可以被指派為 Jr 副主席的主席/副主席/特別助理等。每個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 不熟悉,請閱讀此內容):