Apa praktik terbaik untuk menyimpan metadata catatan individual dalam database?
Saya perlu menyimpan data meta umum seperti waktu pembuatan dan waktu pembaruan terakhir untuk banyak tabel di basis data saya. Saya menemukan beberapa solusi berbeda:
Simpan data meta langsung di tabel.
Pro:
- Data meta secara langsung ditautkan ke catatan
- Tidak diperlukan gabungan untuk mengambil data meta
Cons:
- Diperlukan banyak kolom duplikat (kecuali pewarisan digunakan)
- Data meta dan data bisnis tidak terpisah
Buat tabel meta data umum dengan dan gunakan kunci asing lunak untuk menautkan data ke tabel dan catatan yang benar.
Pro:
- Tidak ada duplikasi kolom
- Data meta dipisahkan dari data bisnis
Cons:
- Tidak ada tautan langsung antara data meta dan data (FK tidak dapat digunakan)
- Bergabung membutuhkan kondisi tambahan
Buat tabel meta data individual untuk setiap tabel yang membutuhkan data meta.
Pro:
- Data meta secara langsung ditautkan ke catatan
- Data meta dipisahkan dari data bisnis
Cons:
- Banyak tabel tambahan diperlukan
- Diperlukan banyak kolom duplikat (kecuali pewarisan digunakan)
Apakah ada lebih banyak pilihan, pro atau kontra daripada yang saya sebutkan di sini? Dan apa praktik terbaik untuk menyimpan data meta ini?
hstore
atauJSON
dapat memecahkan masalah Anda?Jawaban:
Kolom yang Anda bicarakan, menempati 20 byte (jika diluruskan tanpa padding):
timestamp .. 8 byte
timestamp .. 8 byte
integer .. 4 byte
Header tuple dan penunjuk item untuk baris terpisah dalam tabel terpisah saja akan menempati 23 + 1 + 4 = 28 byte ditambah 20 byte data aktual, ditambah 4 byte padding di bagian akhir. Menghasilkan 52 byte per baris . Baca lebih lanjut di sini:
Mengenai penyimpanan Anda tidak mendapatkan apa-apa. Mengenai kinerja Anda tidak akan kehilangan apa pun hanya dengan 16 - 24 byte lebih per baris.
Kolom juga secara langsung menjadi milik baris, jadi masuk akal untuk menyatukannya. Saya membuat kebiasaan untuk menambahkan kolom seperti itu (ditambah sumber terpisah untuk pembaruan terakhir) ke semua tabel yang relevan.
Ini juga lebih mudah untuk menulis
TRIGGER ON INSERT OR UPDATE
agar tetap terbaru.Singkat cerita: suara yang kuat untuk opsi Anda 1 .
Di mana saya akan pergi untuk opsi 3 :
Jika metadata sering diperbarui, sedangkan baris inti tidak. Maka mungkin membayar untuk menjaga tabel 1: 1 yang terpisah untuk membuat UPDATE lebih murah dan mengurangi mengasapi pada tabel utama - atau bahkan pergi untuk opsi 2.
Di mana saya akan pergi untuk opsi 2 :
Jika set kolom metadata sangat berulang. Anda bisa memiliki kolom FK ke set metadata di tabel utama. Tidak menyimpan banyak untuk tiga kolom kecil seperti pada contoh Anda.
sumber