Apa desain database terbaik untuk situasi ini?

8

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?

pengguna1384977
sumber

Jawaban:

10

Aturan praktis yang saya gunakan, adalah bahwa desain database yang buruk harus mengubah tabel untuk mengakomodasi perubahan kode atau fitur baru jika dapat direncanakan di masa depan.

Yang mengatakan, saya akan menggunakan varian Opsi 1

Approvals
    Id PK
    ApprovalTypeID FK
    Status


ApprovalComments
    ID PK
    ApprovalId FK
    Comment

ApprovalTypes
    ID PK
    Name

Sekarang saat menambahkan objek jenis baru yang perlu persetujuan, Anda hanya perlu memasukkan baris ke ApprovalTypes alih-alih mengubah tabel untuk menambahkan kolom.

sreimer
sumber
Di mana hubungan id dengan pesanan / faktur tertentu digunakan dalam situasi ini? Katakanlah pesanan membutuhkan "persetujuan kredit", jadi jenis persetujuannya adalah kredit, tetapi bagaimana tautan ke pesanan (atau entitas apa pun)? Juga, ke mana kolom tambahan akan pergi yang khusus hanya untuk persetujuan kredit?
user1384977
Itu menambah sedikit kerumitan. Anda bisa memiliki tabel CreditApprovalDetails. Jika Anda perlu menautkan persetujuan ke pesanan, Anda akan membutuhkan tabel bergabung, kecuali jika 1: 1. Namun, tanpa pemahaman penuh tentang aplikasi Anda, saya tidak dapat membuat saran.
sreimer
2

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:

Cardinality:
Approval N ---- 1 Approval_comment.
Approval 1 ----- N Order
Order N ----- 1 Invoice

masukkan deskripsi gambar di sini

jcho360
sumber
1

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.

Matzi
sumber
1

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.

mdoyle
sumber
1

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.

techExplorer
sumber
0

Anda dapat mencoba sesuatu seperti ini:

Persetujuan
---------
  Indo
  status
  approver_name
  (hal-hal lain)

Pesanan
------
  Indo
  (hal-hal lain)

Faktur
--------
  Indo
  (hal-hal lain)

objek yang disetujui
----------------
  Indo
  Approval_id (FK - merujuk ke tabel persetujuan)
  disetujui_object_id (FK - dapat merujuk ke ID Faktur, Pesanan, dll ...)
  approved_object_type_id (FK merujuk ke disetujui_object_types)

disetujui_object_types
---------------------
  Indo
  Nama

The approved_objectsmeja memberitahu Anda yang persetujuan yang berjalan dengan obyek disetujui. Objek disetujui bisa di invoices, orders, atau sesuatu yang lain. Anda menentukan tabel mana yang harus dicari berdasarkan approved_object_type_id. Ini akan fleksibel, tetapi bisa membuat pelaporan sedikit rumit.

FrustratedWithFormsDesigner
sumber