Saya sedang dalam proses membuat skema database untuk skenario berikut:
- Ada pengguna
- Pengguna memiliki peran (seperti "Pengembang" atau "CEO")
- Peran memiliki aplikasi (seperti "Topdesk")
- Aplikasi memiliki izin (seperti "Perbarui Knowledgebase")
- Peran dapat memiliki izin, jika peran tersebut sudah memiliki akses ke aplikasi
Dengan asumsi tidak ada lingkungan berkinerja tinggi (tidak perlu mengoptimalkan kecepatan), apa cara terbaik untuk mengimplementasikan skema ini? Lingkungan basis data dapat berupa MySQL, MSSQL ... lebih tentang desain basis data relasional.
Saya sendiri telah membuat yang berikut ini:
Bagian yang paling tidak pasti tentang saya adalah tabel Applications_Permissions_Roles. Ini adalah tabel penautan di atas tabel penautan lainnya. Saya belum pernah menggunakan atau melihat ini sebelumnya. Cara lain untuk melakukannya adalah menggantinya dengan tabel penautan antara Peran dan Izin, dan kemudian menggunakan kode atau batasan untuk memastikan hubungan yang diperlukan ... tapi itu sepertinya bukan solusi yang baik bagi saya. Hal-hal ini harus ditegakkan pada tingkat basis data jika memungkinkan (dan tampaknya memungkinkan), bukan pada tingkat kode.
Kedua, apakah tautan antara Izin. Aplikasi dan Aplikasi. Apakah diperlukan? Saya menggunakannya karena mungkin tidak ada baris di Roles_Applications (seperti ketika Anda baru saja menambahkan aplikasi baru) dan kemudian tidak mungkin untuk menentukan izin mana yang termasuk dalam aplikasi mana. Ini juga merupakan titik referensi tunggal untuk mencari aplikasi yang memiliki izin. Saya kira ini benar, tetapi juga membuat lingkaran dalam desain basis data. Kesalahan MSSQL saat mencoba mengatur ON_DELETE atau ON_UPDATE ke kaskade.
Ada saran, atau apakah ini yang seharusnya dilakukan? Setiap saran lain mengenai konvensi penamaan dan semacamnya juga disambut baik (mungkin sebagai komentar).
Terima kasih,
Luc
Sunting: Judul diubah, mudah-mudahan membuatnya lebih jelas. Yang sebelumnya lebih komprehensif, tetapi mungkin terlalu berbelit-belit.
Roles_Applications
adalah hal yang nyata. Mengingat bahwa semua izin adalah khusus aplikasi, tampaknya adaApplications_Permissions
(apa yang Anda beri labelPermissions
), yang kemudian dapat ditugaskan ke peran tertentu melalui catatan diApplications_Permissions_Roles
.Roles_Applications
, pada kenyataannya, tampaknya menggambarkan izin aplikasi paling dasar - akses sederhana. Atau, itu menyatakan bahwa peran memiliki beberapa tingkat izin untuk aplikasi, tetapi Anda harus mencari di tempat lain untuk menentukan yang mana.Jawaban:
Cara Anda memodelkannya baik-baik saja. Model Anda memastikan bahwa aturan bisnis diberlakukan oleh database.
Ada beberapa hal yang bisa Anda lakukan sebagai alternatif. Salah satunya adalah untuk menghilangkan kunci pengganti
Roles_Applications
. Sebagai tabel persimpangan, Anda bisa menggunakan dua kunci asing bersama sebagai kunci primer komposit. Jika Anda melakukan ini, itu akan menyebarRole
danApplication
turun keApplications_Permissions_Roles
meja Anda . Ini akan memiliki keuntungan memberi Anda lebih banyak dari "one stop shop" untuk data izin aplikasi Anda (yaitu lebih sedikit bergabung) tanpa mengorbankan normalisasi Anda dengan cara apa pun.Cara lain yang bisa Anda lakukan adalah menyederhanakan sedikit dan menetapkan izin default untuk setiap aplikasi. Anda dapat menyebutnya apa pun yang Anda suka, seperti "akses standar" atau "akses dasar" atau "pengguna" atau apa pun yang masuk akal bagi Anda. Ini akan memungkinkan Anda untuk meratakan model Anda dan pada dasarnya menjatuhkan
Roles_Applications
tabel dan bergabungApplications_Permissions_Roles
langsung keRoles
. Ini akan mengubah sifat kueri yang akan Anda gunakan untuk bertanya "peran mana yang dapat mengakses aplikasi mana?" tetapi aturan bisnis Anda masih akan ditegakkan oleh skema.sumber
Roles_Application
tampaknya tidak mewakili hal yang nyata di sini. Apa itu, di luar menandakan bahwa peran tertentu memiliki beberapa tingkat izin untuk suatu aplikasi, meskipun Anda perlu memeriksaApplications_Permissions_Roles
untuk menentukan apa tingkat itu? Sebagai contoh, berikut adalah CEO yang mendapatkan akses tulis ke Kalender aplikasi dalam model Anda saat ini:Peran
Aplikasi
Izin
Aplikasi Roles_
Applications_Permissions_Roles
Saya pikir rangkaian hubungan ini dapat dimodelkan tanpa
Roles_Applications
. Jika kami menghapusnya (seperti yang disarankan Joel Brown, tetapi tanpa perubahan dengan asumsi ada "izin default"):Peran
Aplikasi
Applications_Permissions (nee
Permissions
)Applications_Permissions_Roles
Permissions
Tabel lama tidak hanya memiliki izin, seperti "baca" dan "tulis", yang kemudian dapat diterapkan ke aplikasi seperti "Topdesk" dan "Kalender": Ini berisi izin khusus aplikasi, seperti "write in Topdesk" dan " tulis di Kalender "dan" Ubah jam sistem di Windows ". Untuk membuatnya lebih jelas saya telah menamai tabelApplications_Permissions
tetapi tentu saja itu bukan langkah yang diperlukan.Pendekatan ini memiliki efek meratakan model, seperti halnya saran kedua Joel, tetapi tanpa menambahkan logika aplikasi atau konsep izin default.
Roles_Applications
tidak membawa apa pun ke pesta selain indikasi bahwa peran memiliki beberapa tingkat akses ke aplikasi. Informasi itu disampaikan dengan lebih singkat dengan adanya catatanApplications_Permissions_Roles
dengan nilai Role_ID yang tepat.sumber