Saya telah melakukan sedikit pekerjaan dengan database relasional, dan saya pikir saya memahami konsep dasar desain skema yang baik dengan cukup baik. Baru-baru ini saya ditugaskan untuk mengambil alih sebuah proyek di mana DB dirancang oleh konsultan yang dibayar tinggi. Tolong beri tahu saya jika usus saya intinct - "WTF ??!?" - Dijamin, atau apakah orang ini jenius sehingga dia beroperasi di luar wilayah saya?
DB yang dimaksud adalah aplikasi internal yang digunakan untuk memasukkan permintaan dari karyawan. Hanya dengan melihat sebagian kecil saja, Anda memiliki informasi tentang pengguna, dan informasi tentang permintaan yang dibuat. Saya akan mendesain seperti ini:
Tabel pengguna:
UserID (primary Key, indexed, no dupes)
FirstName
LastName
Department
Tabel permintaan
RequestID (primary Key, indexed, no dupes)
<...> various data fields containing request details
UserID -- foreign key associated with User table
Sederhana bukan?
Konsultan mendesainnya seperti ini (dengan data sampel):
Tabel Pengguna
UserID FirstName LastName
234 John Doe
516 Jane Doe
123 Foo Bar
Tabel Departemen
DepartmentID Name
1 Sales
2 HR
3 IT
Tabel UserDepartment
UserDepartmentID UserID Department
1 234 2
2 516 2
3 123 1
Tabel Permintaan
RequestID UserID <...>
1 516 blah
2 516 blah
3 234 blah
Seluruh basis data dibangun seperti ini, dengan setiap bagian data dienkapsulasi dalam tabelnya sendiri, dengan ID numerik yang menghubungkan semuanya menjadi satu. Rupanya konsultan telah membaca tentang OLAP dan menginginkan 'kecepatan pencarian integer'
Dia juga memiliki sejumlah besar prosedur tersimpan untuk referensi silang semua tabel ini.
Apakah desain ini valid untuk SQL DB kecil hingga menengah?
Terima kasih atas komentar / jawaban ...
Jawaban:
Masuk akal bagi saya. Itu hanya sangat dinormalisasi, yang memberikan banyak fleksibilitas yang Anda tidak akan sebaliknya. Data yang dinormalkan adalah rasa sakit di pantat.
sumber
Saya tidak berpikir bahwa WTF dijamin atau bahwa orang itu melakukan segala jenis desain jenius gila - itu normalisasi basis data standar.
Alasan untuk tabel departemen adalah bahwa jika Anda tidak menempatkan departemen ke dalam tabel terpisah, Anda harus berurusan dengan pengguna di bagian "Penjualan", "penjualan", "Penjual", "Layar", dan "Penjualan", kecuali Anda melakukan sesuatu untuk mencegahnya. Dan memiliki meja tambahan adalah (bagian dari) cara terbaik yang saya tahu untuk melakukan itu.
Apakah harus ada tabel UserDepartment adalah panggilan yang lebih sulit, yang tentu saja berarti tidak ada keputusan yang keluar dan gila. Di satu sisi itu adalah rasa sakit ketika semua desain dan logika tabel Anda telah mengasumsikan satu departemen per pengguna dan kemudian berubah, di sisi lain melakukan join tambahan tanpa alasan selama bertahun-tahun adalah kemungkinan nyata dan juga rasa sakit.
Saya pribadi akan setuju dengan Anda bahwa tabel UserDepartment mungkin berlebihan. Bahkan jika itu termasuk, kemungkinannya adalah bahwa seiring waktu orang akan menulis pertanyaan yang menganggap hanya ada satu pengguna per departemen, sehingga Anda akan berakhir dengan yang terburuk dari kedua dunia - gabung tambahan tanpa alasan sebelum membutuhkan tabel, dan kode tetap tidak berfungsi setelah lebih dari satu departemen per pengguna diizinkan.
EDIT - Pendorong utama apakah hubungan banyak ke banyak harus didukung adalah jika aturan bisnis jelas. Jika Anda tidak tahu bagaimana seorang pengguna di banyak departemen bahkan bekerja, tidak ada gunanya menambahkan tabel, karena kode Anda tidak mungkin menangani kasus-kasus di mana pengguna berada di banyak departemen dengan benar.
Bayangkan Anda mengizinkan banyak departemen per pengguna, untuk berjaga-jaga. Anda kemudian menerapkan aturan bisnis untuk menetapkan komisi, berdasarkan departemen. Kemudian beberapa departemen diizinkan. Untungnya, Anda juga memiliki pandangan ke depan untuk menulis kode komisi Anda dengan cara yang memperhitungkan hal ini. Sayangnya, Anda menambahkan komisi dari masing-masing departemen untuk pengguna di keduanya. Manajemen ingin Anda mendasarkan pada peran orang untuk setiap penjualan. Jadi, seberapa bagus meja itu di muka? Bagaimana dengan tabel lain yang Anda miliki "berjaga-jaga" yang tidak pernah dibutuhkan sama sekali?
EDIT KEMUDIAN - Alasan lain konsultan mungkin ingin menambahkan semua tabel perantara dibahas dalam pertanyaan lanjutan ini , jawaban yang memberikan beberapa alasan mengapa refactoring database biasanya lebih sulit daripada refactoring kode, yang cenderung mendorong Anda ke arah pendekatan "masukkan semua tabel yang mungkin Anda butuhkan".
sumber
Jika persyaratannya adalah memiliki beberapa departemen per pengguna, desain ini masuk akal. Satu-satunya keluhan tentang itu adalah
UserDepartmentTable
memiliki kunci penggantiUserDepartmentID
yang tidak diperlukan (hanya membuatUserId
danDepartmentId
kunci primer komposit).Jika pengguna hanya milik satu departemen, desain Anda masuk akal (meskipun tabel pencarian departemen masih merupakan hal yang baik).
sumber
Beberapa persyaratan tidak jelas dalam pertanyaan Anda. Jawaban yang benar tergantung pada apa yang diinginkan pelanggan Anda - Jika saya adalah Anda, saya akan bertanya kepada pelanggan tentang ini:
0-Apa perbedaan antara pengguna dan karyawan?
1-Dengan asumsi seorang karyawan = pengguna, bagaimana jika seorang karyawan mengubah departemen?
2-Bisakah sekelompok karyawan membuat 1 permintaan?
3-Bisakah seorang karyawan menjadi anggota lebih dari satu departemen? Bagaimana dengan CEO
4-Apakah ada sebagian karyawan yang diizinkan membuat permintaan?
5-Apa yang terjadi pada permintaan ketika catatan karyawan dihapus (jika pernah)?
6-Bisakah Anda menghapus permintaan? Apa yang terjadi ketika permintaan dihapus (pastikan Anda tidak menghapus catatan karyawan oleh RI)
7-Bisakah karyawan membuat permintaan "sama" lebih dari satu kali (mendefinisikan "sama")
8-Bagaimana menangani permintaan untuk karyawan ketika mereka meninggalkan perusahaan (membatalkan permintaan mereka atau menghapus permintaan?)
Mungkin ada lebih banyak pertanyaan, tetapi poin saya adalah bahwa solusinya tergantung pada persyaratan yang tepat dan ruang lingkup proyek. Setelah itu ditentukan skema dapat diturunkan secara langsung. Dengan demikian kedua solusi yang disajikan mungkin benar.
sumber
Saya ingin menambahkan beberapa catatan formulir poin berbicara secara eksplisit tentang beberapa keuntungan potensial dari menggunakan tabel bergabung dengan cara yang dilakukan konsultan Anda yang dibayar tinggi.
UserDepartmentTable.Department
tidak lebih "sulit" daripada mencari kolom lain dalamUser
tabel.UserDepartmentTable.Active
false dan membuat asosiasi baru yang aktif). Dimungkinkan juga untuk membuat versi asosiasi departemen dengan model dua-tabel (hanya Pengguna dan Departemen), tetapi lebih sulit dan mengharuskan menambahkan setidaknya satu kolom lagi atau melakukan akrobat database untuk menghindari duplikasi kunci primer.Yang sedang berkata, ada beberapa alasan untuk TIDAK melakukan apa yang konsultan bayaran Anda lakukan.
sumber
Tanpa struktur penuh informasi yang dibutuhkan, saya tidak dapat mengatakan apakah ini mengerikan atau tidak. Tetapi setidaknya potongan yang ditampilkan bukan dari desain "WTF". Itu hanya tampak sebagai Bentuk Normal 3-rd dari struktur data (well, kami secara teoritis juga 4-rd dan 5-th juga)
Beberapa pembicaraan dapat memiliki tempat untuk UserDepartmentTable antara dua sekolah kunci "alami" dan "buatan" di bagian yang ditampilkan. Tidak ada yang lebih, seperti yang saya lihat
Normalisasi adalah aturan DB-developer / designer yang baik karena banyak alasan, * de * normalisasi kadang-kadang digunakan di tengah perkembangan untuk memenangkan-menang sebagian besar
sumber