Pertanyaan ini seputar bagaimana saya harus mendesain database, bisa berupa database relasional / nosql, tergantung pada apa yang akan menjadi solusi yang lebih baik
Diberi persyaratan di mana Anda harus membuat sistem yang akan melibatkan basis data untuk melacak "Perusahaan" dan "Pengguna". Satu pengguna selalu hanya milik satu perusahaan
- Seorang pengguna hanya dapat menjadi bagian dari satu perusahaan
- Perusahaan dapat memiliki banyak pengguna
Desain untuk tabel "Perusahaan" cukup mudah. Perusahaan akan memiliki atribut / kolom berikut: (mari kita tetap sederhana)
ID, COMPANY_NAME, CREATED_ON
Skenario pertama
Sederhana & lurus ke depan, semua pengguna memiliki atribut yang sama, jadi ini dapat dengan mudah dilakukan dalam gaya relasional, tabel pengguna:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CREATED_ON
Skenario kedua
Apa yang terjadi jika perusahaan yang berbeda ingin menyimpan atribut profil yang berbeda untuk pengguna mereka. Setiap perusahaan akan memiliki seperangkat atribut yang ditentukan yang akan berlaku untuk semua pengguna perusahaan itu.
Sebagai contoh:
- Perusahaan A ingin menyimpan: LIKE_MOVIE (boolean), LIKE_MUSIC (boolean)
- Perusahaan B ingin menyimpan: FAV_CUISINE (String)
- Perusahaan C ingin menyimpan: OWN_DOG (boolean), DOG_COUNT (int)
Pendekatan 1
cara brute force adalah memiliki skema tunggal untuk pengguna dan membiarkan mereka memiliki nol ketika mereka bukan milik perusahaan:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, LIKE_MOVIE, LIKE_MUSIC, FAV_CUISINE, OWN_DOG, DOG_COUNT, CREATED_ON
Yang agak jahat karena Anda akan berakhir dengan banyak NULLS dan baris pengguna yang memiliki kolom yang tidak relevan dengan mereka (mis. Semua pengguna milik Perusahaan A memiliki nilai NULL untuk FAV_CUISINE, OWN_DOG, DOG_COUNT)
Pendekatan 2
pendekatan kedua, adalah memiliki "bidang bentuk bebas":
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_1, CUSTOM_2, CUSTOM_3, CREATED_ON
Yang tidak menyenangkan karena Anda sendiri tidak tahu bidang khusus apa, tipe data tidak akan mencerminkan nilai yang disimpan (mis. Kami akan menyimpan nilai int sebagai VARCHAR).
Pendekatan 3
Saya telah melihat ke dalam bidang JSON PostgreSQL, dalam hal ini Anda akan memiliki:
ID, COMPANY_ID, FIRST_NAME, LAST_NAME, EMAIL, CUSTOM_PROFILE_JSON, CREATED_ON
Dalam hal ini, bagaimana Anda bisa menerapkan skema yang berbeda untuk pengguna? Seorang pengguna dengan Perusahaan A akan memiliki skema yang terlihat seperti
{"LIKE_MOVIE":"boolean", "LIKE_MUSIC": "boolean"}
Sementara pengguna dengan Perusahaan C akan memiliki skema berbeda:
{"OWN_DOG ":"boolean", "DOG_COUNT": "int"}
Bagaimana saya mengatasi masalah ini? Bagaimana saya bisa mendesain database dengan benar untuk memungkinkan skema fleksibel ini untuk satu "objek" (Pengguna) berdasarkan hubungan yang mereka miliki (Perusahaan)?
solusi relasional? solusi nosql?
Sunting: Saya juga memikirkan tabel "CUSTOM_PROFILE" yang pada dasarnya akan menyimpan atribut pengguna dalam baris daripada kolom.
Ada 2 masalah dengan pendekatan ini:
1) Data tumbuh per pengguna tumbuh sebagai baris daripada kolom - dan ini berarti untuk mendapatkan gambaran lengkap dari pengguna, banyak gabungan yang harus dilakukan, beberapa bergabung ke tabel "profil khusus" pada atribut khusus yang berbeda
2) Nilai data selalu disimpan sebagai VARCHAR untuk menjadi generik, bahkan jika kita tahu data itu seharusnya bilangan bulat atau boolean dll