Salah satu item dalam Java Efektif Joshua Bloch adalah gagasan bahwa kelas harus memungkinkan mutasi instance sesedikit mungkin, dan lebih disukai tidak sama sekali.
Seringkali, data suatu objek disimpan ke database dari beberapa bentuk. Hal ini membuat saya berpikir tentang ide kekekalan dalam database, terutama untuk tabel-tabel yang mewakili satu kesatuan dalam sistem yang lebih besar.
Sesuatu yang saya telah bereksperimen dengan baru-baru ini adalah gagasan untuk mencoba meminimalkan pembaruan yang saya lakukan pada baris tabel yang mewakili objek-objek ini, dan mencoba melakukan sisipan sebanyak yang saya bisa.
Contoh nyata dari sesuatu yang saya coba-coba baru-baru ini. Jika saya tahu saya mungkin menambahkan catatan dengan data tambahan nanti, saya akan membuat tabel lain untuk mewakili itu, seperti dua definisi tabel berikut:
create table myObj (id integer, ...other_data... not null);
create table myObjSuppliment (id integer, myObjId integer, ...more_data... not null);
Mudah-mudahan jelas bahwa nama-nama ini bukan kata demi kata, tetapi hanya untuk menunjukkan idenya.
Apakah ini pendekatan yang masuk akal untuk pemodelan ketekunan data? Apakah layak mencoba membatasi pembaruan yang dilakukan di atas meja, terutama untuk mengisi nol untuk data yang mungkin tidak ada saat catatan awalnya dibuat? Apakah ada saat-saat ketika pendekatan seperti ini dapat menyebabkan rasa sakit yang parah di kemudian hari?
sumber
UPDATE
). Seperti catatan medis dokter.Jawaban:
Tujuan utama dari immutability adalah untuk memastikan bahwa tidak ada waktu instan ketika data dalam memori dalam keadaan tidak valid. (Yang lain adalah karena notasi matematika sebagian besar statis, dan hal-hal yang tidak berubah lebih mudah untuk dikonseptualisasikan dan dimodelkan secara matematis.) Dalam memori, jika utas lain mencoba membaca atau menulis data saat sedang dikerjakan, mungkin akhirnya akan rusak, atau itu sendiri mungkin dalam keadaan korup. Jika Anda memiliki beberapa operasi penugasan ke bidang objek, dalam aplikasi multithreaded, utas lain mungkin mencoba bekerja dengannya di antaranya - yang mungkin buruk.
Immutability memperbaiki hal ini dengan pertama-tama menulis semua perubahan ke tempat baru di memori, dan kemudian melakukan tugas akhir sebagai satu langkah silih berganti penulisan pointer ke objek untuk menunjuk ke objek baru - yang pada semua CPU merupakan atom. operasi.
Basis data melakukan hal yang sama menggunakan transaksi atom : ketika Anda memulai transaksi, ia menulis semua pembaruan baru ke tempat baru pada disk. Ketika Anda menyelesaikan transaksi, itu mengubah pointer pada disk ke tempat pembaruan baru - yang dilakukannya dalam waktu singkat di mana proses lain tidak bisa menyentuhnya.
Ini juga hal yang persis sama dengan ide Anda membuat tabel baru, kecuali lebih otomatis dan lebih fleksibel.
Jadi untuk menjawab pertanyaan Anda, ya, kekekalan bagus dalam database, tetapi tidak, Anda tidak perlu membuat tabel terpisah hanya untuk tujuan itu; Anda bisa menggunakan perintah transaksi atom apa pun yang tersedia untuk sistem basis data Anda.
sumber
Itu tergantung pada manfaat apa yang Anda harapkan dari ketidakberdayaan. Jawaban Rei Miyasaka ditujukan pada satu (penghindaran kondisi perantara yang tidak valid), tetapi inilah yang lain.
Mutasi kadang-kadang disebut pembaruan destruktif : ketika Anda bermutasi suatu objek, keadaan lama hilang (kecuali Anda mengambil langkah-langkah tambahan untuk secara eksplisit melestarikannya entah bagaimana). Sebaliknya, dengan data yang tidak dapat diubah, sepele untuk secara simultan mewakili negara baik sebelum dan sesudah beberapa operasi, atau untuk mewakili beberapa negara penerus. Bayangkan mencoba menerapkan pencarian pertama dengan memutasikan satu objek negara.
Ini mungkin muncul di dunia database paling sering sebagai data temporal . Katakan bulan lalu Anda menggunakan paket Basic, tetapi pada tanggal 16 Anda beralih ke paket Premium. Jika kami hanya menimpa beberapa bidang yang menunjukkan rencana apa yang Anda jalankan, kami mungkin mengalami kesulitan dalam penagihan. Kami mungkin juga kehilangan kemampuan untuk menganalisis tren. (Hei, lihat apa yang dilakukan kampanye iklan lokal ini!)
Itulah yang terlintas di pikiran saya ketika Anda mengatakan "kekekalan dalam desain basis data".
sumber
Customer
tabel hanya untuk mengingat bahwa pengguna mengubah rencana tidak membawa apa-apa selain kelemahan kinerja yang besar, pemilihan yang lebih lambat dari waktu ke waktu, penambangan data yang lebih rumit (dibandingkan dengan log) dan lebih banyak ruang yang terbuang.Jika Anda tertarik pada manfaat yang bisa Anda dapatkan dari ketidakmampuan dalam suatu basis data, atau setidaknya suatu basis data yang menawarkan ilusi ketidakmampuan, periksa Datomic.
Datomic adalah Basis Data yang ditemukan oleh Rich Hickey dalam aliansi dengan Think Relevance, ada banyak video yang menjelaskan arsitektur, tujuan, dan model data. Cari infoq, satu khususnya berjudul Datomic, Database as a Value . Dalam kebingungan Anda dapat menemukan keynote yang diberikan oleh Rich Hickey di konferensi euroclojure pada tahun 2012. confreaks.com/videos/2077-euroclojure2012-day-2-keynote-the-datomic-architecture-and-data-model
Ada pembicaraan di vimeo.com/53162418 yang lebih berorientasi pengembangan.
Ini ada satu lagi dari stuart halloway di.pscdn.net/008/00102/videoplatform/kv/121105techconf_close.html
Sekarang, karena info disimpan sebagai fakta dalam waktu:
Basis data adalah nilai, dan parameter ke mesin kueri, QE mengelola koneksi dan caching. Karena Anda dapat melihat db sebagai nilai, dan struktur data yang tidak dapat diubah dalam memori, Anda dapat menggabungkannya dengan struktur data lain yang dibuat dari nilai "di masa depan" dan meneruskannya ke QE & kueri dengan nilai masa depan, tanpa mengubah database aktual .
Ada proyek open source dari Rich Hickey, yang disebut codeq , Anda dapat menemukannya di github Datomic / codeq, yang memperluas model git, dan menyimpan referensi ke objek git dalam database bebas datomik, dan membuat kueri kode Anda, Anda dapat melihat contoh cara menggunakan datomic.
Anda dapat menganggap datomik sebagai ACID NoSQL, dengan datum Anda dapat memodelkan tabel atau dokumen atau Kv-store atau grafik.
sumber
Gagasan untuk menghindari pembaruan, dan lebih suka menyisipkan, adalah salah satu pemikiran di balik membangun penyimpanan data Anda sebagai Sumber Kejadian, sebuah ide yang sering Anda temukan digunakan bersama dengan CQRS. Dalam model sumber acara, tidak ada pembaruan: agregat diwakili sebagai urutan "transformasi" (peristiwa), dan akibatnya penyimpanan hanya ditambahkan.
Situs ini berisi diskusi menarik tentang CQRS dan sumber acara, jika Anda ingin tahu tentang itu!
sumber
Ini memiliki hubungan yang sangat dekat dengan apa yang dikenal sebagai "Dimensi Perlahan Berubah" di dunia pergudangan data, dan tabel "Temporal" atau "Bi-Temporal" di domain lain.
Konstruk dasarnya adalah:
Keuntungan dari skema ini adalah Anda dapat menciptakan kembali "keadaan" entitas logis Anda kapan saja, Anda memiliki riwayat entitas Anda dari waktu ke waktu dan Anda meminimalkan pertengkaran jika "entitas logis" Anda banyak digunakan.
Kerugiannya adalah Anda menyimpan lebih banyak data, dan Anda perlu mempertahankan lebih banyak indeks (paling tidak pada Logical Key + ValidFrom + ValidTo). Indeks pada Kunci Logis + Versi Terbaru sangat mempercepat sebagian besar kueri. Ini juga mempersulit SQL Anda!
Apakah ini layak dilakukan kecuali jika Anda benar-benar perlu mempertahankan sejarah dan memiliki persyaratan untuk menciptakan kembali keadaan entitas Anda pada titik waktu tertentu, itu terserah Anda.
sumber
Alasan lain yang memungkinkan untuk memiliki basis data yang tidak dapat diubah adalah untuk mendukung pemrosesan paralel yang lebih baik. Pembaruan yang terjadi rusak dapat mengacaukan data secara permanen, sehingga penguncian harus dilakukan untuk mencegah hal itu, menghancurkan kinerja paralel. Banyak sisipan acara dapat berlangsung dalam urutan apa pun, dan negara bagian paling tidak pada akhirnya akan benar selama semua acara akhirnya diproses. Namun ini sangat sulit untuk dikerjakan dalam praktek dibandingkan dengan melakukan pembaruan basis data sehingga Anda harus benar-benar membutuhkan banyak paralelisme untuk mempertimbangkan melakukan hal-hal dengan cara ini - saya tidak merekomendasikannya.
sumber
Penafian: Saya cukup baru di DB: hlm
Karena itu, pendekatan data satelit ini memiliki dampak langsung pada kinerja:
tergantung pada kebutuhan Anda, Anda dapat menerima ini, atau tidak, tetapi ini tentu saja merupakan hal yang perlu dipertimbangkan.
sumber
Saya tidak melihat bagaimana skema Anda dapat disebut "tidak berubah".
Apa yang terjadi ketika nilai yang disimpan dalam tabel tambahan berubah? Sepertinya Anda perlu melakukan pembaruan di meja itu.
Agar database benar-benar tidak berubah, ia perlu dikelola hanya oleh "INSERTS". Untuk ini, Anda memerlukan beberapa metode untuk mengidentifikasi baris "saat ini". Ini hampir selalu berakhir dengan sangat tidak efisien. Anda juga harus menyalin semua nilai sebelumnya yang tidak berubah atas, atau, menyatukan keadaan saat ini dari beberapa catatan saat Anda kueri. Pemilihan baris saat ini biasanya membutuhkan beberapa SQL yang sangat berantakan seperti (
where updTime = (SELECT max(updTime) from myTab where id = ?
).Masalah ini banyak muncul di DataWarehousing di mana Anda harus menyimpan riwayat data dari waktu ke waktu, dan, dapat memilih negara untuk setiap titik waktu tertentu. Solusinya biasanya tabel "dimensional". Namun sementara mereka memecahkan masalah DW "yang merupakan tenaga penjualan Januari lalu". Mereka tidak memberikan keuntungan apa pun yang dikerjakan oleh kelas-kelas yang tidak berubah di Jawa.
Pada catatan yang lebih filosofis; database ada untuk menyimpan "state" (saldo bank Anda, konsumsi listrik Anda, poin brownies Anda di StackOverflow dll.) yang mencoba memunculkan database "stateless" tampaknya merupakan latihan yang agak tidak berguna.
sumber
WHERE id = {} ORDER BY updTime DESC LIMIT 1
umumnya tidak terlalu tidak efisien.