Mysql

Mysql 數據庫設計 - 辨識所需的模式

  • August 17, 2020

我試圖找出哪種模式(如果有)可以描述我在為俱樂部會員管理系統設計數據庫時所面臨的問題。我需要幫助來辨識模式(如果存在的話)或一些我需要考慮的指針,以便取得一些進展。

成員是一個主要實體,其中包含一些資訊,例如聯繫方式。會員可以在俱樂部擔任中心職能,即擔任司庫或準將等。

為了對俱樂部的頂級層次結構進行建模,我將擁有來自會員的 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 不熟悉,請閱讀內容): 在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/273858