Saya perlu melacak perubahan harga produk sehingga saya dapat meminta db untuk harga produk pada tanggal tertentu. Informasi tersebut digunakan dalam sistem yang menghitung audit historis sehingga harus mengembalikan harga yang benar untuk produk yang benar berdasarkan tanggal pembelian.
Saya lebih suka menggunakan postgres dalam membangun db.
Saya perlu dengan desain database tetapi setiap dan semua saran praktik terbaik juga diterima.
database-design
best-practices
Gunnar Norred
sumber
sumber
prices
dibuat tabelprices_history
dengan kolom serupa. Hibernate Envers dapat mengotomatisasi ini untuk AndaJawaban:
Jika saya memahami skenario dengan tepat, Anda harus mendefinisikan tabel yang mempertahankan rangkaian waktu Harga ; oleh karena itu, saya setuju, ini ada hubungannya dengan aspek temporal dari database yang Anda gunakan.
Peraturan bisnis
Mari kita mulai menganalisis situasi dari level konseptual. Jadi, jika , dalam domain bisnis Anda,
maka itu artinya
The IDEF1X diagram yang ditunjukkan di Gambar 1 , meskipun sangat sederhana, menggambarkan skenario seperti:
Tata letak logis ekspositori
Dan desain tingkat logis SQL-DDL berikut, berdasarkan diagram IDEF1X tersebut, menggambarkan pendekatan yang layak yang dapat Anda sesuaikan dengan kebutuhan Anda sendiri:
The
Price
meja memiliki PRIMARY KEY komposit terdiri dari dua kolom, yaitu,ProductNumber
(dibatasi, pada gilirannya, sebagai FOREIGN KEY yang membuat referensi untukProduct.ProductNumber
) danStartDate
(menunjukkan yang khusus Tanggal di mana tertentu Produk dibeli di tertentu Harga ) .Dalam hal Produk yang dibeli di berbagai Harga selama sama Day , bukan
StartDate
kolom, Anda mungkin termasuk salah satu label sebagaiStartDateTime
yang membuat Instan ketika diberikan Produk dibeli pada tepat Harga . KUNCI UTAMA kemudian harus dinyatakan sebagai(ProductNumber, StartDateTime)
.Seperti yang diperagakan, tabel tersebut adalah yang biasa, karena Anda dapat mendeklarasikan operasi SELECT, INSERT, UPDATE, dan DELETE untuk memanipulasi datanya secara langsung, sehingga (a) memungkinkan menghindari pemasangan komponen tambahan dan (b) dapat digunakan di semua platform SQL utama dengan beberapa penyesuaian, jika perlu.
Sampel manipulasi data
Untuk mencontohkan beberapa operasi manipulasi yang tampaknya berguna, katakanlah Anda telah menyisipkan data berikut dalam tabel
Product
danPrice
, masing-masing:Karena
Price.EndDate
ini adalah titik data yang dapat diturunkan, maka Anda harus mendapatkannya melalui, tepatnya, tabel turunan yang dapat dibuat sebagai tampilan untuk menghasilkan rangkaian waktu "penuh", seperti yang dicontohkan di bawah ini:Kemudian operasi berikut yang SELECT langsung dari pandangan itu
memasok set hasil berikutnya:
Sekarang, mari kita asumsikan bahwa Anda tertarik untuk mendapatkan seluruh
Price
data untuk yangProduct
diidentifikasi olehProductNumber
1750 padaDate
2 Juni 2017 . Melihat bahwaPrice
pernyataan (atau baris) terkini atau efektif selama seluruh Interval yang berjalan dari (i)StartDate
hingga (ii)EndDate
, maka operasi DML inimenghasilkan set hasil yang mengikuti
yang membahas persyaratan tersebut.
Seperti yang ditunjukkan,
PriceWithEndDate
tampilan memainkan peran penting dalam memperoleh sebagian besar data yang dapat diderivasi, dan dapat DIPILIH DARI dengan cara yang cukup biasa.Dengan mempertimbangkan bahwa platform preferensi Anda adalah PostgreSQL, konten ini dari situs dokumentasi resmi berisi informasi tentang pandangan "terwujud" , yang dapat membantu untuk mengoptimalkan kecepatan eksekusi melalui mekanisme tingkat fisik, jika aspek tersebut menjadi bermasalah. Sistem manajemen basis data SQL lainnya (DBMS) menawarkan instrumen fisik yang sangat mirip, meskipun terminologi yang berbeda dapat diterapkan, misalnya, pandangan "diindeks" di Microsoft SQL Server.
Anda dapat melihat contoh kode DDL dan DML yang dibahas beraksi di biola db <> ini dan dalam Biola SQL ini .
Sumber terkait
Dalam tanya jawab ini kami membahas konteks bisnis yang mencakup perubahan Harga Produk tetapi memiliki cakupan yang lebih luas, sehingga Anda mungkin merasa tertarik.
Posting Stack Overflow ini mencakup poin yang sangat relevan mengenai jenis kolom yang menyimpan datum mata uang di PostgreSQL.
Tanggapan terhadap komentar
Metode yang saya usulkan di atas membahas domain bisnis dari karakteristik yang dijelaskan sebelumnya , akibatnya menerapkan saran Anda tentang mendeklarasikan
EndDate
sebagai kolom — yang berbeda dari “bidang” - dari tabel dasar yang dinamaiPrice
akan menyiratkan bahwa struktur logis dari database akan tidak mencerminkan skema konseptual dengan benar, dan skema konseptual harus didefinisikan dan tercermin dengan presisi, termasuk diferensiasi (1) informasi dasar dari (2) informasi yang dapat diturunkan .Terlepas dari itu, tindakan semacam itu akan memperkenalkan duplikasi, karena
EndDate
kemudian dapat diperoleh berdasarkan (a) tabel yang dapat diturunkan dan juga berdasarkan (b) tabel dasar yang dinamaiPrice
, denganEndDate
kolom yang kemudian diduplikasi . Sementara itu adalah suatu kemungkinan, jika seorang praktisi memutuskan untuk mengikuti pendekatan tersebut, ia harus dengan jelas memperingatkan pengguna database tentang ketidaknyamanan dan ketidakefisienan yang ditimbulkannya. Salah satu dari ketidaknyamanan dan ketidakefisienan tersebut adalah, misalnya, kebutuhan mendesak untuk mengembangkan suatu mekanisme yang memastikan, setiap saat , bahwa setiapPrice.EndDate
nilai sama dengan yang ada padaPrice.StartDate
kolom baris yang langsung berturut-turut untukPrice.ProductNumber
nilai yang ada.Sebaliknya, pekerjaan untuk menghasilkan data turunan yang dipermasalahkan seperti yang saya ajukan adalah, jujur, tidak istimewa sama sekali, dan diharuskan untuk (i) menjamin korespondensi yang benar antara tingkat abstraksi logis dan konseptual dari database dan (ii) ) memastikan integritas data, kedua aspek yang seperti disebutkan sebelumnya jelas sangat penting.
Jika aspek efisiensi yang Anda bicarakan terkait dengan kecepatan eksekusi beberapa operasi manipulasi data, maka itu harus dikelola di tempat yang tepat, yaitu, pada tingkat fisik, melalui, misalnya, strategi pengindeksan yang menguntungkan, berdasarkan pada (1) ) kecenderungan permintaan tertentu dan (2) mekanisme fisik tertentu yang disediakan oleh DBMS penggunaan. Kalau tidak, mengorbankan pemetaan konseptual-logis yang sesuai dan kompromi integritas data yang terlibat dengan mudah mengubah sistem yang kuat (yaitu, aset organisasi yang berharga) menjadi sumber daya yang tidak dapat diandalkan.
Rangkaian waktu yang terputus-putus atau terputus-putus
Di sisi lain, ada keadaan di mana mempertahankan
EndDate
setiap baris dalam tabel deret waktu tidak hanya lebih nyaman dan efisien tetapi juga menuntut , meskipun tentu saja itu tergantung sepenuhnya pada persyaratan spesifik lingkungan bisnis. Salah satu contoh keadaan semacam itu muncul ketikaSaya telah mewakili skenario tersebut dalam diagram IDEF1X yang ditampilkan pada Gambar 2 .
Dalam hal itu, ya,
Price
tabel hipotetis harus dideklarasikan dengan cara yang mirip dengan ini:Dan, ya, desain DDL logis menyederhanakan administrasi di tingkat fisik, karena Anda dapat memasang strategi pengindeksan yang mencakup
EndDate
kolom (yang, seperti yang ditunjukkan, dinyatakan dalam tabel dasar) dalam konfigurasi yang relatif lebih mudah .Kemudian, operasi SELECT seperti yang di bawah ini
dapat digunakan untuk memperoleh seluruh
Price
data untuk yangProduct
diidentifikasi olehProductNumber
1750 padaDate
tanggal 2 Juni 2017 .sumber
Saya percaya Anda akan ingin melihat Tabel Temporal . Ini menyediakan fungsionalitas untuk melakukan apa yang Anda cari dan tersedia di Postgres dengan ekstensi yang tepat.
Konsep ini terlihat juga DB agnostik, karena ditawarkan pada berbagai platform RDBMS .
sumber
Saya memberi jawaban di sini yang relatif sederhana dan tidak memerlukan ekstensi khusus ke basis data (karena itu akan bekerja dengan basis data apa pun).
sumber