Cara terbaik untuk menyimpan nilai yang bisa berupa banyak jenis

10

Saya ingin mengajukan kembali pertanyaan dengan cara yang lebih langsung dan umum:

Bagaimana Anda membuat tabel untuk menyimpan nilai yang bisa menjadi beberapa tipe berbeda?

Dalam kasus saya, nilai-nilai menyediakan diagnostik tentang suatu peristiwa. Mis: Peristiwa terjadi -> Simpan bacaan dari beberapa PLC yang berisi informasi terkait tentang acara tersebut. PLC dapat memonitor semua jenis data.

Beberapa contoh yang dapat saya pikirkan:

  • Buat kolom untuk setiap jenis yang mungkin dan buat kolom lain untuk menunjukkan kolom mana yang akan digunakan
    • Mis: Cols: IntVal, StrVal, BoolVal, Type. Vals: null, null, True, "BOOL"
  • Simpan nilai apa pun sebagai varchar
Pantai Jared
sumber

Jawaban:

9

Tampaknya Anda telah diberi tahu bahwa Anda sedang menyimpang di jalan menuju model EAV . Lihatlah gambar di sini untuk alasan mengapa model EAV harus dihindari dengan segala cara.

Bill Karwin, penulis yang bertanggung jawab atas gambar di atas, telah menulis buku "SQL Antipatterns: Avoiding the Pitfalls of Database Programming" dan dia mencurahkan bab pertama untuk anti-pola EAV. Dia juga pemukul besar di grup ini dan besar di StackOverflow (untuk masalah database).

Saran saya adalah memiliki tabel untuk setiap jenis hasil dan kemudian menggunakan VIEWs untuk menggabungkannya bila perlu.

Sebagai contoh, Anda bisa memilikinya

CREATE TABLE char_result
(
  question_id INT,
  user_id INT,
  cresult CHAR,
  result_correct BOOLEAN (or equivalent in your RDBMS)
  ..
  <other stuff>
  ..
);

Lakukan hal yang sama untuk num_result, kecuali pengganti nresult INT (FLOAT ... apa pun) untuk cresult - ide yang sama untuk VARCHAR & c.

Lalu buat VIEWdi atas tabel hasil berbeda untuk result_correct(dan bidang lainnya - number_of_attempts... & c. - apa pun bidang Anda yang lain). Dalam hal ini, Anda membandingkan suka dengan suka dan tidak melakukan perhitungan setara dengan menambahkan populasi ke ketinggian sesuai gambar lucu yang dirujuk di atas!

Vérace
sumber
Sebagai counter untuk Bill, saya telah menulis yang mendukung EAV di sini: sqlblog.com/blogs/aaron_bertrand/archive/2009/11/19/…
Aaron Bertrand
Saya tidak berpikir memiliki beberapa tipe yang mungkin untuk kolom logis yang sama merupakan EAV. Saya pikir dia sedang mencari tipe "varian / objek". Itu jauh lebih mudah dilakukan dengan beberapa kolom dari satu tabel per tipe. Kedengarannya sangat merepotkan. Dan setelah tampilan dibuat itu benar-benar hal yang sama dengan membuat jenis di tabel yang sama di tempat pertama.
usr
@ Usr Saya akan tertarik melihat solusi Anda.
Jared Beach
2
Hanya satu kolom per jenis tampaknya baik untuk saya. Saya telah melakukannya seperti itu di masa lalu. Itu solusi yang paling tidak buruk. Berikut argumen lain: Bagaimana jika ada dua kolom yang diketik secara bervariasi. Solusi jawaban ini membutuhkan sejumlah tabel kuadrat. Orang bisa membaginya menjadi tabel dasar ditambah N * M lebih banyak tabel ... Ini sepertinya tidak benar.
usr
@ usr bukankah salah satu masalah dengan solusi Anda yang tidak satupun dari kolom-kolom itu bisa NOT NULL? Secara pribadi, saya sangat percaya memiliki NOT NULLkekangan bila memungkinkan .
Vérace
2

Saya pikir jika itu benar-benar diperlukan untuk menyimpan nilai dengan cara ini dalam database relasional, saya akan menggunakan solusi seperti kolom JSON Microsoft SQL Server .

Pantai Jared
sumber