Desain Database Mysql - mengidentifikasi pola yang diperlukan
Saya mencoba untuk mencari tahu pola mana (jika ada) yang mungkin menggambarkan masalah yang saya hadapi ketika merancang database untuk sistem manajemen keanggotaan klub. Saya memerlukan bantuan dalam mengidentifikasi pola (jika ada) atau beberapa petunjuk tentang pertimbangan apa yang perlu saya buat untuk membuat kemajuan.
Anggota adalah entitas utama, dengan beberapa informasi seperti detail kontak mereka. Anggota dapat memiliki fungsi sentral di klub, yaitu menjadi bendahara atau komodor dll.
Untuk memodelkan hierarki tingkat atas klub, saya akan mendapatkan ID dari Anggota, tabel enumerasi "BoardMemberTypes" dan tabel "BoardMembersType" yang menghubungkan keduanya.
Namun, Klub juga memiliki sub-grup, masing-masing dengan struktur hierarki mereka sendiri.
Setiap Anggota adalah bagian dari setidaknya satu Subgrup, dengan subgrup Peran "anggota", dan jenis keanggotaan seperti "aktif" atau "pasif".
Masing-masing struktur ini memiliki beberapa peran yang identik dan sedikit. Sebagai contoh:
- Subkelompok A memiliki ketua, wakil ketua, bendahara dari set yang sama, dan "Ketua Teknologi Subkelompok A" dari daftar yang hanya berlaku untuk Subkelompok A
- Subkelompok B memiliki ketua, bendahara, dan peran "Subkelompok B 1" dan "Subkelompok Khusus B 2"
- Subgoup C mungkin hanya memiliki kursi dan peran "Subgroup C Khusus".
Subkelompok adalah bagian yang rumit:
Enumeration Table "Subgroup" (ID, Name)
Enumeration Table "MembershipType" (ID, Name)
Enumeration Table "MembershipFunction" (ID, Name)
Rintangan pertama: Saat menampilkan antarmuka admin, saya perlu membatasi MembershipFunction bergantung pada subgrup. Saya kira ini dapat dicapai melalui tabel tautan:
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
Secara teori, sekarang saya bisa membuat tabel "MembersSubgroupMembershipFunctions" dengan MembersID, SubgroupMembershipFunctionsId
Pada titik ini, saya masih kurang memiliki kemampuan untuk menyimpan MembershipType (aktif, pasif) yang hanya berlaku untuk entri "anggota". Hasil akhir yang saya butuhkan mungkin seperti ini
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(?)
Setiap bantuan, petunjuk atau ide untuk meningkatkan desain ini sangat dihargai.
Jawaban
Saya tidak tahu apakah ada pola desain di luar "normalisasi dengan benar", tapi menurut saya Anda tidak terlalu jauh dari solusi yang bisa diterapkan.
Berdasarkan deskripsi Anda, saya tidak melihat kebutuhan akan Subgroup
entitas - kami hanya dapat memiliki Groups
dan menunjukkan salah satunya sebagai "The Board".
Untuk lebih spesifik GroupFunctions
, kami akan menganggapnya sebagai kasus khusus GroupMembers
, yaitu begitu seseorang ditugaskan ke grup, mereka dapat ditugaskan sebagai Ketua / Wakil Ketua / Asisten Khusus untuk Wakil Ketua Jr / dll. Masing GroupFunction
- masing dapat ditetapkan maksimal satu GroupMember
.
Sedangkan untuk aktif / pasif / dll., Sangat mungkin untuk memiliki satu tingkat untuk Member
dan tingkat yang berbeda untuk masing-masing Group
, tetapi Anda mungkin memerlukan logika transaksi jika anggota "pasif" tidak dapat menjadi anggota "aktif" dari grup. Sebagai alternatif, Anda bisa mendapatkan MembershipType
untuk masing-masing Member
berdasarkan grup tempat mereka menjadi anggotanya.
Saya akan menyerahkan tipe data dan DDL lengkap kepada Anda (termasuk tabel audit), tetapi ini seharusnya berfungsi:
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)
);
Gambar biasanya lebih mudah dipahami (jika Anda tidak terbiasa dengan IDEF1X, baca ini ):
