Struktur database relasional terbaik untuk data ini

8

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:

Diagram ERD

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.

Luc
sumber
Saya tidak yakin saya memusatkan pikiran saya pada interaksi peran, aplikasi, dan izin. Setiap peran / aplikasi memiliki izin khusus yang independen dari aplikasi peran lainnya? Misalnya, CEO / Topdesk mungkin hanya memiliki izin baca, sedangkan CEO / Kalender mungkin sudah menulis?
mdoyle
Saya tidak mengerti apa yang Anda maksud "skema basis data relasional terbaik untuk data ini" maksud Anda mesin apa? Suka Postgres atau MySQL atau MSSQL atau ... dll?
jcolebrand
@ jcolebrand Tebak judulnya bahkan lebih tidak jelas dari sebelumnya ... Mungkin "struktur database" adalah kata yang lebih baik. Tata letak dan hubungan tabel (kunci asing, dll.).
Luc
@mdoyle Izin selalu ada dalam aplikasi (contoh: izin 'ubah jam sistem' di aplikasi 'windows') dan dengan demikian izin milik tepat satu aplikasi. Peran dapat memiliki izin dan aplikasi, satu-satunya kendala adalah bahwa jika Anda memiliki izin, Anda juga harus memiliki akses ke aplikasi tempat izin tersebut berada. (Jelas jika Anda tidak dapat menggunakan Topdesk, Anda tidak dapat memiliki izin 'Perbarui pengetahuan' untuk Topdesk aplikasi.) Apakah ini membuatnya lebih jelas?
Luc
Saya tidak yakin itu Roles_Applicationsadalah hal yang nyata. Mengingat bahwa semua izin adalah khusus aplikasi, tampaknya ada Applications_Permissions(apa yang Anda beri label Permissions), yang kemudian dapat ditugaskan ke peran tertentu melalui catatan di Applications_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.
mdoyle

Jawaban:

3

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 menyebar Roledan Applicationturun ke Applications_Permissions_Rolesmeja 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_Applicationstabel dan bergabung Applications_Permissions_Roleslangsung ke Roles. 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.

Joel Brown
sumber
Terimakasih atas tanggapan Anda! Saya belum memikirkan saran-saran ini. Saran kedua akan menambahkan banyak logika aplikasi: semua tempat yang menangani izin harus memeriksa apakah operasi tidak dilakukan pada izin default (karena itu tidak boleh berubah atau bahkan mungkin ditampilkan); dan hal-hal yang berhubungan dengan aplikasi harus memastikan izin default dibuat atau dihapus dengan tepat. Ini akan menyederhanakan database, tetapi tampaknya dengan biaya yang lebih tinggi. Saran pertama adalah opsi, saya pikir saya akan menerapkan ini. Terima kasih lagi untuk ulasannya :)
Luc
1

Roles_Applicationtampaknya 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 memeriksa Applications_Permissions_Rolesuntuk menentukan apa tingkat itu? Sebagai contoh, berikut adalah CEO yang mendapatkan akses tulis ke Kalender aplikasi dalam model Anda saat ini:

Peran

ID    Name
--    ----
1     CEO

Aplikasi

ID    Name
--    ----
C     Calendar

Izin

ID    Application_ID  Permission
--    --------------  ----------
10    C               Write

Aplikasi Roles_

ID    Role_ID    Application_ID
--    -------    --------------
50    1          C

Applications_Permissions_Roles

Role_Application_ID    Permission_ID
-------------------    -------------
50                     10

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

ID    Name
--    ----
1     CEO

Aplikasi

ID    Name
--    ----
C     Calendar

Applications_Permissions (nee Permissions)

ID    Application_ID  Permission
--    --------------  ----------
10    C               Write

Applications_Permissions_Roles

Role_ID    Application_Permission_ID
-------    -------------
1          10

PermissionsTabel 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 tabel Applications_Permissionstetapi 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_Applicationstidak membawa apa pun ke pesta selain indikasi bahwa peran memiliki beberapa tingkat akses ke aplikasi. Informasi itu disampaikan dengan lebih singkat dengan adanya catatan Applications_Permissions_Rolesdengan nilai Role_ID yang tepat.

mdoyle
sumber
Oke, saya mengerti maksud Anda sekarang. Masalahnya adalah seseorang tidak selalu memiliki izin pada suatu aplikasi. Seperti dengan Microsoft Word, tidak ada sama sekali. Dalam kasus tersebut tidak diketahui peran mana yang dapat mengakses aplikasi mana; Anda harus selalu memiliki setidaknya satu izin dari aplikasi yang ditugaskan untuk suatu peran. Itulah saran "izin default" dari Joel Brown. Terima kasih untuk sarannya! Itu bukan ide yang buruk dan masuk akal, tetapi saya tidak bisa menerapkannya pada situasi saya. * Terpilih *
Luc
Untuk sesuatu seperti Word, bukankah "mengeksekusi" izin? Tapi saya mengerti maksud Anda jika karena alasan tertentu menjalankan atau mengakses aplikasi tidak dianggap sebagai izin.
mdoyle