Saya sedang bekerja membangun aplikasi bisnis untuk perusahaan saya dan berjuang untuk memilih desain database yang paling tepat untuk situasi tertentu. Katakanlah saya memiliki entitas berikut:
Persetujuan
- Indo
- Status
- ...
Persetujuan Persetujuan
- Indo
- ApprovalId
- Komentar
Memesan
- Indo
- ...
Faktur
- Indo
- ...
Jelas ada beberapa jenis persetujuan dan beberapa objek yang memerlukan persetujuan. Apa yang paling sesuai dari opsi berikut untuk mendesain tabel:
PILIHAN 1
Memiliki satu tabel persetujuan dengan kunci asing nol:
Persetujuan
- Id PK
- Status
- PesanId FK NULL
- InvoiceId FK NULL
Persetujuan Persetujuan
- Id PK
- Persetujuan FK
- Komentar
Dalam hal ini saya harus menambahkan kolom untuk setiap objek yang membutuhkan persetujuan
PILIHAN 2
Memiliki tabel Persetujuan orang tua dengan bidang yang sama, dan tabel anak untuk setiap objek yang membutuhkan persetujuan:
Persetujuan
- Id PK
- Status
Persetujuan Persetujuan
- Id PK
- Persetujuan FK
- Komentar
Persetujuan Pesanan
- Persetujuan PK FK
- OrderId FK
Persetujuan Faktur
- Persetujuan PK FK
- Faktur FK
OPSI 3
Memiliki tabel persetujuan untuk setiap objek:
Persetujuan Pesanan
- Id PK
- OrderId FK
- Status
OrderApprovalComments
- Id PK
- OrderApprovalId FK
- Komentar
Persetujuan Faktur
- Id PK
- Faktur FK
- Status
InvoiceApprovalComments
- Id PK
- InvoiceApprovalId FK
- Komentar
Saya tahu ini semua solusi yang valid, tetapi saya tidak bisa memutuskan mana yang terbaik untuk menambahkan berbagai jenis persetujuan di masa mendatang. Adakah pikiran?
sumber
Terserah kardinalitas dari DB Anda, dan hal-hal apa yang ingin Anda simpan, misalnya Anda hanya dapat membuat approval_comment seperti unik dan membuat 1-1 hubungan antara approval dan approval_comment, sehingga Anda akan lompatan membuat satu tabel tambahan ... Saya melihatnya seperti ini:
sumber
Saya memilih alternatif pertama. Jika Anda menambahkan persyaratan yang disetujui untuk suatu item, Anda dapat mengubah perilaku item tersebut, jadi menambahkan kolom bukanlah masalah besar. Dan juga, ini adalah cara terbaik untuk menggunakan gabungan dalam kueri.
Yang kedua memiliki tabel tambahan yang tidak berguna, yang mungkin menunjukkan bahwa lebih dari satu persetujuan mungkin milik satu item.
Yang ketiga berisi banyak tabel redundan, dan mungkin kode redundan untuk menanganinya.
sumber
Jika Anda harus memutuskan antara salah satu dari tiga opsi Anda, saya yakin Opsi 2 adalah yang terbaik. @sreimer benar bahwa harus mengubah struktur tabel Anda untuk poin acara yang dapat diperkirakan pada desain yang buruk. Memiliki OrderID dan InvoiceID dalam tabel Persetujuan, seperti yang saya lihat, sangat dekat dengan grup berulang di kolom dan melanggar semangat, jika bukan huruf, dari bentuk normal pertama.
Saya akan mempertimbangkan menambahkan kolom ApprovalID ke setiap tabel yang membutuhkan persetujuan. Jika nilainya nol, itu belum disetujui. Jika itu bukan pilihan, saya pikir @sreimer ke desain yang tepat - beberapa klarifikasi dapat membantu mengencangkannya.
sumber
Saya sarankan Anda hanya memiliki satu tabel =>
Persetujuan
Indo
status
komentar
Dan memiliki approvalId disimpan di inovice atau tabel Orde. Dengan cara ini Anda tidak perlu menambahkan kolom untuk setiap objek dan ada lebih sedikit tabel untuk dipelihara. Dan jika saya harus memilih antara opsi yang telah Anda berikan saya akan pergi dengan opsi 2 dan menggabungkan komentar persetujuan ke dalam tabel persetujuan.
sumber
Anda dapat mencoba sesuatu seperti ini:
The
approved_objects
meja memberitahu Anda yang persetujuan yang berjalan dengan obyek disetujui. Objek disetujui bisa diinvoices
,orders
, atau sesuatu yang lain. Anda menentukan tabel mana yang harus dicari berdasarkanapproved_object_type_id
. Ini akan fleksibel, tetapi bisa membuat pelaporan sedikit rumit.sumber