Praktik terbaik untuk menyimpan metadata rekaman


10

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:

  1. 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
  2. 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
  3. 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?


Metadata macam apa yang sedang kita bicarakan? Mungkin menggunakan kolom hstoreatau JSONdapat memecahkan masalah Anda?
a_horse_with_no_name

@a_horse_with_no_name - Saat ini saya hanya perlu waktu pembuatan, waktu pembaruan dan sumber pembuatan. Kolom sudah diperbaiki jadi saya tidak perlu kunci-nilai seperti penyimpanan. Saya hanya khawatir di mana saya harus menyimpan data.
Tiddo

1
Maka saya tidak melihat alasan untuk tidak menambahkan tiga kolom ke tabel dasar.
a_horse_with_no_name

Jawaban:


7

Kolom yang Anda bicarakan, menempati 20 byte (jika diluruskan tanpa padding):

waktu pembuatan, waktu pembaruan dan sumber pembuatan

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 UPDATEagar 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.


Bagaimana dengan menyelesaikan masalah ini dengan pewarisan tabel, adakah kelemahan yang luar biasa dibandingkan dengan menggunakan metadata colum langsung di tabel? Namun jika saya mengerti dengan benar, pewarisan tabel postgres tidak sesuai dengan standar SQL, bukan?
devrys

1
@devrys: Warisan memiliki beberapa keterbatasan dalam Postgres Lebih penting lagi: Saya tidak melihat bagaimana pewarisan dapat menyelesaikan penyimpanan beberapa kolom tambahan per baris. itu akan menjadi pilihan jika Anda memiliki beberapa baris dengan dan baris lain tanpa metadata. Tetapi saya tidak akan menggunakannya untuk itu.
Erwin Brandstetter
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.