Mysql Veritabanı Tasarımı - gerekli kalıpları tanımlama

Aug 17 2020

Bir kulüp üyelik yönetim sistemi için veri tabanını tasarlarken karşılaştığım sorunu (varsa) hangi modelin tanımlayabileceğini anlamaya çalışıyorum. Modeli (varsa) tanımlamada yardıma veya biraz ilerleme sağlamak için neleri dikkate almam gerektiğine dair bazı işaretlere ihtiyacım var.

Üyeler, üzerlerindeki iletişim bilgileri gibi bazı bilgiler içeren ana varlıktır. Üyeler, kulüpte merkezi görevlere sahip olabilirler, yani sayman veya komodor vb. Olabilir.

Kulübün en üst düzey hiyerarşisini modellemek için, Üyelerden ID'ye, ikisini birbirine bağlayan "BoardMemberTypes" numaralandırma tablosuna ve "BoardMembersType" tablosuna sahip olacaktım.

Bununla birlikte, Kulübün her biri kendi hiyerarşi yapısına sahip alt grupları da vardır.

Her Üye, Rol "üye" alt grubu ve "aktif" veya "pasif" gibi üyelik türü ile Alt Gruplardan en az birinin parçasıdır.

Bu yapıların her birinin birkaç özdeş ve birkaç özel rolü vardır. Örnek olarak:

  • Alt Grup A'da aynı gruptan başkan, başkan yardımcısı, sayman ve yalnızca Alt Grup A için geçerli olan bir listeden "Alt Grup A Teknoloji Başkanı" vardır.
  • Alt Grup B'nin bir başkanı, saymanı ve "Spesifik Alt Grup B 1" ve "Spesifik Alt Grup B 2" rolü vardır
  • C alt grubunun yalnızca bir başkanı ve bir "Belirli Alt Grup C" rolü olabilir.

Alt gruplar karmaşık bitlerdir:

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

İlk engel: Yönetici arayüzünü sunarken, alt gruba bağlı olarak Üyelik İşlevini kısıtlamam gerekir. Sanırım bu bir bağlantı tablosu aracılığıyla başarılabilir:

 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

Teoride, artık MembersID, SubgroupMembershipFunctionsId ile "MembersSubgroupMembershipFunctions" tablosu oluşturabilirim

Bu noktada, yalnızca "üye" girişi için gerçekten geçerli olan MembershipType'ı (aktif, pasif) saklama yeteneğinden hâlâ yoksunuz. İhtiyacım olan sonuç böyle bir şey olabilir belki

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(?)

Bu tasarımı geliştirmeye yönelik herhangi bir yardım, işaretçi veya fikir çok takdir edilmektedir.

Yanıtlar

1 bbaird Aug 17 2020 at 22:54

"Düzgün normalleştirmenin" ötesinde bir tasarım modeli olup olmadığını bilmiyorum, ancak uygulanabilir bir çözümden çok uzak olduğunuzu düşünmüyorum.

Açıklamanız göz önüne alındığında, bir Subgroupvarlığa ihtiyaç olduğunu görmüyorum - Groupsbunlardan birine sahip olabilir ve "Kurul" olarak adlandırabiliriz.

Spesifik olarak GroupFunctions, bunları özel bir durum olarak ele alacağız GroupMembers, yani bir kişi bir gruba atandığında, Jr Başkan Yardımcısına Başkan / Başkan Yardımcısı / Özel Asistan atanabilir. Her GroupFunctionbiri en fazla birine atanabilir GroupMember.

Aktif / pasif / vb. Gelince, her biri için bir seviye Memberve her biri için farklı seviyeler olması tamamen mümkündür Group, ancak eğer "pasif" üye bir grubun "aktif" üyesi olamazsa bazı işlem mantığına ihtiyacınız olabilir. Alternatif olarak, MembershipTypeher biri Memberiçin üye oldukları gruplara göre türetebilirsiniz .

Veri türlerini ve tam DDL'yi size bırakacağım (denetim tabloları dahil), ancak bu çalışmalıdır:

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)
);

Resimler (eğer IDEF1X alışık değilseniz, okumak anlamak genellikle daha kolaydır bu ):