ข้อดีและข้อเสียในการใช้ประเภท Enum กับจำนวนเต็ม?


110

ช่วยให้พูดในตารางสุ่มบางท่านมีชื่อคอลัมน์สถานะ มันเป็นค่าที่แท้จริงของโลกจะได้รับการอย่างใดอย่างหนึ่งที่เปิดใช้งานหรือปิดการใช้งาน

มันจะดีกว่าสำหรับชนิดข้อมูลของคอลัมน์นี้จะเป็น int / บูล (1 หรือศูนย์) หรือจะใช้ENUMกับค่าที่เป็นenabledและdisabled? ข้อดีหรือข้อเสียคืออะไร?

สมมุติว่าแทนที่จะเป็นเพียงสองสถานะที่ถูกต้องคุณมี 4 หรือ 10 หรือมากกว่านั้น ข้อดีและข้อเสียจะแกว่งไปด้านใดด้านหนึ่งหรือไม่เมื่อจำนวนค่าที่ต้องการเพิ่มขึ้น?


5
คำถามนี้ควรถูกบุ๊กมาร์กโดยนักพัฒนา MySQL ทุกคนเพราะอาจกลายเป็นแหล่งที่มาของความปวดใจหรือชัยชนะ +1 !!!
RolandoMySQLDBA

คำตอบ:


70

ฉันพบบทความที่แปลกประหลาดมาก แต่มีข้อมูลเกี่ยวกับ 8 เหตุผลว่าทำไมไม่ควรใช้ ENUM

แม้จะไม่มีบทความฉันก็รู้


1
แม้ว่าคำตอบอื่น ๆ ในกระทู้นี้จะให้ข้อมูลมาก แต่ฉันก็ทำเครื่องหมายคำตอบนี้เพราะบทความที่มีประโยชน์มาก
Jake Wilson

6
+1 คุณไม่สามารถใช้ซ้ำรายการสมาชิกของคอลัมน์ ENUM ในตารางอื่นได้ ENUM มีข้อ จำกัด ในการพกพาไปยัง DBMS อื่น ๆ
oneday เมื่อ

ฉันต้องทำอย่างไรถ้าฉันมีสาขาที่มีความสัมพันธ์กับบันทึกอื่น ๆ ของตารางเดียวกัน ตัวอย่างเช่นสมมติว่าแบบจำลองสำหรับรายการร้านค้าที่แต่ละระเบียนควรจะมีคุณสมบัติสำหรับหน่วยงานที่เกี่ยวข้องของunits compositionเช่น Ton, Kg, gm
SaidbakR

ไม่มีอะไรแปลกประหลาดเกี่ยวกับบทความนั้น - เยี่ยมมาก! ฉันคิดว่ามันเป็นโพสต์นี้ที่ทำให้ฉันทำไมพวกเขาไม่ดี! ฉันให้ +1 เลย!
Vérace

1
บทความแนะนำให้ใช้ตารางเก่าที่ดีแทนประเภท ENUM เราควรเพิ่มสิ่งนี้ในคำตอบหรือไม่?
Utku

39

ดีปิดแรกเรามีความต้องการจัดเก็บ ฉันจะถือว่าคุณหมายถึง smallint (แทน int)

  • ENUM ใช้เวลา 1 ไบต์ (ถ้าต่ำกว่า 255 ค่า) หรือ 2 ไบต์ (สูงสุด 65,535
  • TinyInt ใช้เวลา 1 ไบต์ (สูงสุด 255 ค่า)
  • Boolean เป็นคำพ้องความหมายสำหรับ TinyInt

ดังนั้นบนพื้นผิวพวกมันเหมือนกันหมด ENUM ใช้ข้อมูลเมตาบางส่วนสำหรับค่าสตริงที่สัมพันธ์กับค่านั้น ( เก่ากว่า src )

ผมจะบอกว่าเมื่อคุณเพิ่มค่ามากขึ้นแม้ว่าประโยชน์ใด ๆ ENUMเริ่มที่จะแกว่งตัวออกไปจาก โดยเฉพาะอย่างยิ่งถ้าคุณเพิ่มค่าหลังจากตารางถูกใช้งานอยู่แล้วเนื่องจากคุณต้องเปลี่ยนโครงสร้างตารางเพื่อรองรับ

ประโยชน์ของการใช้คืออะไรENUM? การแทนค่าสตริงของค่าหมายถึงอะไร แค่เท่าที่ฉันกังวล คุณค่านั้นขึ้นอยู่กับแอปพลิเคชันของคุณ


4
+1 สำหรับการกล่าวถึงข้อได้เปรียบที่แท้จริงเท่านั้น: การแทนค่าสตริง ทุกอย่างอื่นคือการล้างไปข้างหน้า
RolandoMySQLDBA

19

ฉันพบว่า ENUM เป็นคำนิยามแบบสั้น ๆ ของตารางรหัส ข้อได้เปรียบหลักคือมันหลีกเลี่ยงรหัสที่จำเป็นในการเข้าร่วมและแสดงคำอธิบายรหัส นอกจากนี้ยังลดการตั้งค่าหากมาถึงในรูปแบบสตริง

ฉันพบว่ามันมีข้อเสียดังต่อไปนี้:

  • ไม่มีความสามารถในการเมตาดาต้าเพิ่มเติมเกี่ยวกับรหัส
  • ยากที่จะเพิ่มหรือปิดการใช้งานค่า (การปิดใช้งานรหัสสามารถทำได้โดยใช้ทริกเกอร์และฟิลด์หมดอายุ)
  • I18n ในฐานข้อมูลไม่สามารถทำได้
  • ไม่สามารถใช้ซ้ำในตารางได้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.