Mysql Veritabanı Tasarımı - gerekli kalıpları tanımlama
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
"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 Subgroup
varlığa ihtiyaç olduğunu görmüyorum - Groups
bunlardan 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 GroupFunction
biri en fazla birine atanabilir GroupMember
.
Aktif / pasif / vb. Gelince, her biri için bir seviye Member
ve 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, MembershipType
her biri Member
iç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 ):
