Keuntungan dan Kerugian menggunakan ENUM vs tipe Integer?

110

Katakanlah dalam beberapa tabel acak, Anda memiliki status kolom bernama . Nilai-nilai dunia nyata akan diaktifkan atau dinonaktifkan .

Apakah lebih baik untuk tipe data kolom ini menjadi int / bool (1 atau nol) atau untuk digunakan ENUMdengan nilai sedang enableddan disabled? Apa kelebihan atau kekurangannya?

Katakanlah alih-alih hanya dua status yang valid, Anda memiliki 4 atau 10 atau bahkan lebih? Apakah keuntungan dan kerugian bergoyang ke satu sisi atau yang lain karena jumlah nilai yang diminta meningkat?

Jake Wilson
sumber
5
Pertanyaan ini harus di-bookmark oleh semua Pengembang MySQL karena dapat menjadi sumber patah hati atau kemenangan. +1 !!!
RolandoMySQLDBA

Jawaban:

70

Saya menemukan artikel yang sangat aneh tetapi informatif tentang 8 alasan mengapa seseorang tidak boleh menggunakan ENUM.

Bahkan tanpa artikel itu, saya tahu

RolandoMySQLDBA
sumber
1
Meskipun jawaban lain di utas ini sangat informatif, saya menandai jawaban ini karena artikelnya sangat membantu.
Jake Wilson
6
+1 Anda tidak dapat menggunakan kembali daftar anggota kolom ENUM di tabel lain. ENUM memiliki portabilitas terbatas untuk DBMS lainnya.
onedaywhen
Apa yang harus saya lakukan jika saya memiliki bidang yang memiliki hubungan dengan catatan lain dari tabel yang sama? Misalnya, anggap unitsmodel untuk item toko di mana setiap catatan harus memiliki properti untuk unit terkait composition. yaitu Ton, Kg, gm
SaidbakR
Tidak ada yang aneh dengan artikel itu - hebat! Saya pikir posting ini yang membuat saya mengapa mereka buruk! Saya memberinya +1!
Vérace
1
Artikel menyarankan untuk menggunakan tabel lama yang baik, bukan tipe ENUM. Haruskah kita menambahkan ini ke jawabannya?
Utku
39

Ya, pertama-tama kita memiliki persyaratan penyimpanan . Saya akan menganggap Anda berarti tinyint (bukan int).

  • ENUM membutuhkan 1 byte (jika di bawah 255 nilai) atau 2 byte (hingga maksimum 65.535)
  • TinyInt membutuhkan 1 byte (maksimum 255 nilai)
  • Boolean adalah sinonim untuk TinyInt

Jadi, di permukaan, semuanya sama saja. ENUM memang mengambil beberapa metadata untuk nilai string yang terkait dengannya ( src yang lebih tua )

Saya akan mengatakan ketika Anda menambahkan lebih banyak nilai, setiap keuntungan mulai menjauh ENUM. Terutama jika Anda menambahkan nilai setelah tabel sudah digunakan, karena Anda harus mengubah struktur tabel untuk mengakomodasi.

Apa keuntungan menggunakan ENUM? Representasi string tentang apa artinya nilai. Itu saja, sejauh yang saya ketahui. Betapa berharganya itu tergantung pada aplikasi Anda.

Derek Downey
sumber
4
+1 untuk menyebutkan satu-satunya keuntungan nyata: Representasi string. Yang lainnya adalah mencuci maju.
RolandoMySQLDBA
19

Saya menemukan ENUM adalah definisi bentuk pendek dari tabel kode. Keuntungan utamanya adalah menghindari kode yang diperlukan untuk bergabung dan menunjukkan deskripsi kode. Ini juga memudahkan pengaturan nilai jika mereka tiba dalam bentuk string.

Saya merasa memiliki kelemahan sebagai berikut:

  • Tidak ada kemampuan untuk metadata tambahan tentang kode.
  • Sulit untuk menambah atau menonaktifkan nilai. (Menonaktifkan kode dapat dilakukan dengan bidang pemicu dan kedaluwarsa.)
  • I18n dalam database tidak dapat dilakukan.
  • Tidak dapat digunakan kembali di seluruh tabel.
BillThor
sumber