เหตุใดจึงเก็บค่าสถานะ / enums ในฐานข้อมูลเป็นสตริงแทนที่จะเป็นจำนวนเต็ม


29

ฉันได้ทำการสืบค้น SQL ทิ้งของ CMS ที่มีชื่อเสียงบางตัวรวมถึง Drupal 7, Wordpress (บางรุ่นที่ค่อนข้างเก่า) และแอปพลิเคชันที่กำหนดเองบางตัวที่ใช้ Python

ดัมพ์เหล่านี้ทั้งหมดมีข้อมูลที่มีแฟล็กสตริงแทนค่าจำนวนเต็ม ยกตัวอย่างเช่นสถานะการโพสต์ได้แสดงเป็นpublished, closedหรือinheritมากกว่า1, หรือ23

ฉันมีประสบการณ์ค่อนข้าง จำกัด ในการออกแบบฐานข้อมูลและฉันไม่เคยผ่าน SQL แบบง่าย ๆ มาก่อน แต่ฉันได้รับการสอนเสมอว่าฉันควรใช้ตัวเลข / จำนวนเต็มสำหรับข้อมูลเช่นนี้ ก็ชัดเจนว่าพื้นที่กินมากน้อยในฐานข้อมูลกว่ายกตัวอย่างเช่นtinyintvarchar(9)

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


7
คุณแน่ใจหรือว่าพวกเขาไม่ได้ใช้dev.mysql.com/doc/refman/5.0/en/enum.htmlซึ่งจะมีลักษณะเหมือนสตริงในการถ่ายโอนข้อมูล ด้วยวิธีใดก็ตามที่ฉันคิดว่าวันนี้มันเกือบจะนับเป็นการเพิ่มประสิทธิภาพขนาดเล็ก
Esben Skov Pedersen


2
คำถามนี้เป็นการอุทธรณ์ต่อผู้มีอำนาจ
DeadMG

3
ไม่ใช่คำตอบเต็มรูปแบบ แต่ ... คุณรู้จักภาษาสคริปต์ Lua หรือไม่ ขึ้นชื่อเรื่องความตรงและประสิทธิภาพสูงเคยเขียนเอ็นจิ้นเกมทั้งหมดเป็นต้น น่าแปลกใจที่พวกเขาไม่เคยใส่ใจเลยที่จะพิมพ์ตัวเลข รหัสการจัดการสตริงของพวกเขานั้นมีประสิทธิภาพมากพวกเขาสามารถเพิ่มตัวเลขเข้าด้วยกันซึ่งเป็นสตริงในโค้ดเอนจินของเกมที่มีความอ่อนไหวต่อเวลา เช่นเดียวกับ JavaScript พวกเขาไม่มีแม้กระทั่งวัตถุ - เพียงแค่ตารางแฮชแฟนซีมาก มุมมองของโปรแกรมเมอร์ C เกี่ยวกับ "อาร์เรย์จำนวนมากchar? ประสิทธิภาพต่ำแค่ไหน!" ล้าสมัยเมื่อเทียบกับ 2558
Katana314

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

คำตอบ:


45

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

ประโยชน์คืออะไร คุณสามารถอ่านฐานข้อมูลได้อย่างง่ายดายและทำความเข้าใจกับสิ่งที่เกิดขึ้นโดยไม่ต้องจดจำตาราง enum และแม้แต่ GUI กึ่งทางการอาจใช้ชุดรูปแบบค่าแทนการเปลี่ยนระเบียนที่พวกเขาได้รับ (นี่เป็นรูปแบบพื้นฐานของพื้นที่ดิสก์ / เวลาในการประมวลผล)

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


7

ใช่จัดเก็บสิ่งต่าง ๆ เช่นyesหรือtrueจะใช้พื้นที่มากขึ้นกว่านิดหน่อย สิ่งนี้ไม่น่าแปลกใจ นอกจากนี้ยังทำให้การจัดทำดัชนีและทำให้มีประสิทธิภาพน้อยลงสำหรับฐานข้อมูล นอกจากนี้ยังมีบทลงโทษสำหรับความสับสนที่อาจเกิดขึ้นกับค่าที่ถูกต้อง ( yesvs y)

อย่างไรก็ตามมีหลายวิธีที่คล้ายกับการจัดเก็บสตริงในฐานข้อมูล (โดยเฉพาะ MySQL) ที่มีประสิทธิภาพ

อันดับแรก MySQL มีenumประเภท ( docs ) ซึ่งสามารถมีลักษณะเหมือนชุดบูลีนหรือชุดของสตริงที่ จำกัด เมื่อทำการตั้งค่าแบบนั้น นอกจากนี้ยังบังคับให้ป้อนเฉพาะค่าที่ถูกต้องเท่านั้น นี้มักจะเป็นประโยชน์มากขึ้นกว่าการจัดเก็บ1, 2หรือ3เป็นค่าเป็นความหมายที่เป็นสื่อที่มีข้อมูลที่ enum มาพร้อมกับบทลงโทษที่ต้องการเปลี่ยนสกีมาเพื่อเพิ่มหรือลบประเภท

สิ่งนี้นำเราไปสู่ตารางลูกและคีย์ต่างประเทศ (ใช้ได้กับฐานข้อมูลทั้งหมด) ใช่คุณเก็บค่าบางอย่างเป็นคีย์ (กลับไป1, 2หรือ3) และความคุ้มค่าของpublished, closedและinheritถูกเก็บไว้ในตารางอื่น การใช้มุมมอง ( เอกสาร ) จากนั้นจึงเป็นไปได้ที่จะทำให้ดูเหมือนว่าตารางมีสตริงมากกว่าที่สำคัญ สิ่งนี้มีข้อดีที่ไม่จำเป็นต้องเปลี่ยนสกีมาเพื่อเพิ่มหรือลบรายการจากตารางลูก

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

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