ข้อผิดพลาดทั่วไปในการออกแบบฐานข้อมูล

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

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

ความผิดพลาดของฐานข้อมูล # 1: การทำซ้ำเขตข้อมูลในตาราง

กฎพื้นฐานสำหรับการออกแบบฐานข้อมูลที่ดีคือการจดจำข้อมูลซ้ำและวางคอลัมน์ที่ทำซ้ำไว้ในตารางของตนเอง การทำซ้ำเขตข้อมูลในตารางเป็นเรื่องปกติสำหรับผู้ที่มาจากโลกของสเปรดชีต แต่ในขณะที่สเปรดชีตมีแนวโน้มที่จะแบนโดยการออกแบบฐานข้อมูลควรมีความสัมพันธ์ เหมือนกับการไปจาก 2D ไปจนถึง 3D

โชคดีที่ฟิลด์ที่ทำซ้ำมักจะมองไม่เห็นได้ง่าย เพียงแค่ดูที่ตารางนี้:

OrderID Product1 Product2 Product3
1 ตุ๊กตาหมี ถั่วเยลลี่
2 ถั่วเยลลี่

จะเกิดอะไรขึ้นเมื่อคำสั่งซื้อประกอบด้วยผลิตภัณฑ์ 4 ชิ้น? เราจำเป็นต้องเพิ่มฟิลด์อื่นลงในตารางเพื่อสนับสนุนผลิตภัณฑ์มากกว่า 3 รายการ และถ้าเราได้สร้างแอปพลิเคชันไคลเอ็นต์ขึ้นมาบนโต๊ะเพื่อช่วยเราในการป้อนข้อมูลเราอาจต้องปรับเปลี่ยนข้อมูลดังกล่าวในฟิลด์ผลิตภัณฑ์ใหม่ และเราจะหาคำสั่งซื้อทั้งหมดใน Jellybeans ได้อย่างไร? เราจะถูกบังคับให้ต้องค้นหาฟิลด์ผลิตภัณฑ์ทั้งหมดในตารางด้วยคำสั่ง SQL ที่อาจมีลักษณะดังนี้: SELECT * FROM Products WHERE Product1 = 'Jelly Beans' หรือ Product2 = 'Jelly Beans' หรือ Product3 = 'Jelly Beans'

แทนที่จะมีตารางเดียวที่ stuffs ข้อมูลทั้งหมดร่วมกันเราควรมีสามตารางที่แต่ละถือชิ้นส่วนที่แตกต่างกันของข้อมูล ในตัวอย่างนี้เราต้องการให้ตารางใบสั่งซื้อมีข้อมูลเกี่ยวกับใบสั่งซื้อตารางผลิตภัณฑ์พร้อมกับผลิตภัณฑ์ทั้งหมดของเราและแท็บเล็ต ProductOrders ที่เชื่อมโยงผลิตภัณฑ์ตามใบสั่ง

OrderID รหัสลูกค้า วันสั่ง ทั้งหมด
1 7 1/24/17 19.99
2 9 1/25/17 24.99
ProductID สินค้า นับ
1 ตุ๊กตาหมี 1
2 ถั่วเยลลี่ 100
ProductOrderID ProductID OrderID
101 1 1
102 2 1

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

ความผิดพลาดของฐานข้อมูล # 2: การฝังตารางลงในตาราง

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

ถ้าหากคุณมีตารางการขายคนอื่นข้อมูลทั้งหมดในตารางนั้นควรเกี่ยวข้องกับผู้ขายนั้นโดยเฉพาะ ข้อมูลเพิ่มเติมใด ๆ ที่ไม่ซ้ำกับผู้ขายนั้นอาจอยู่ในที่อื่นในฐานข้อมูลของคุณ

SalesID เป็นครั้งแรก สุดท้าย ที่อยู่ หมายเลขโทรศัพท์ สำนักงาน OfficeNumber
1 แซม เอลเลียต 118 Main St, ออสติน, เท็กซัส (215) 555-5858 ออสตินดาวน์ทาวน์ (212) 421-2412
2 อลิซ ช่างเหล็ก 504 2nd Street, นิวยอร์ก, NY (211) 122-1821 นิวยอร์ก (ตะวันออก) (211) 855-4541
3 โจ ตำบล 428 Aker St, ออสติน, เท็กซัส (215) 545-5545 ออสตินดาวน์ทาวน์ (212) 421-2412

แม้ว่าตารางนี้อาจมีลักษณะคล้ายคลึงกับพนักงานขายแต่ละราย แต่ก็มีตารางที่ฝังอยู่ภายในตาราง แจ้งให้ Office และ OfficeNumber ทำซ้ำกับ "Austin Downtown" จะทำอย่างไรถ้าหมายเลขโทรศัพท์สำนักงานเปลี่ยนไป คุณจะต้องอัปเดตชุดข้อมูลทั้งหมดสำหรับการเปลี่ยนแปลงข้อมูลชิ้นเดียวซึ่งไม่เคยเป็นสิ่งที่ดี ควรย้ายเขตข้อมูลเหล่านี้ไปที่ตารางของตนเอง

SalesID เป็นครั้งแรก สุดท้าย ที่อยู่ หมายเลขโทรศัพท์ OfficeID
1 แซม เอลเลียต 118 Main St, ออสติน, เท็กซัส (215) 555-5858 1
2 อลิซ ช่างเหล็ก 504 2nd Street, นิวยอร์ก, NY (211) 122-1821 2
3 โจ ตำบล 428 Aker St, ออสติน, เท็กซัส (215) 545-5545 1
OfficeID สำนักงาน OfficeNumber
1 ออสตินดาวน์ทาวน์ (212) 421-2412
2 นิวยอร์ก (ตะวันออก) (211) 855-4541

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

ความผิดพลาดของฐานข้อมูล # 3: การใส่ข้อมูลสองชิ้นหรือมากกว่าลงในช่องเดียว

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

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

นี่คือสิ่งที่ตารางควรมีลักษณะดังนี้:

SalesID เป็นครั้งแรก สุดท้าย ที่อยู่ 1 ที่อยู่ 2 เมือง สถานะ ซิป โทรศัพท์
1 แซม เอลเลียต 118 Main St ออสติน เท็กซัส 78720 2155555858
2 อลิซ ช่างเหล็ก 504 2nd St New York นิวยอร์ก 10022 2111221821
3 โจ ตำบล 428 Aker St Apt 304 ออสติน เท็กซัส 78716 2155455545

มีสองสิ่งที่ควรทราบที่นี่ ขั้นแรก "ที่อยู่ 1" และ "ที่อยู่ 2" ดูเหมือนจะตกอยู่ภายใต้ความผิดพลาดของเขตข้อมูลที่ทำซ้ำ

อย่างไรก็ตามในกรณีนี้หมายถึงข้อมูลที่แยกต่างหากซึ่งเกี่ยวข้องโดยตรงกับผู้ขายมากกว่ากลุ่มข้อมูลที่ทำซ้ำซึ่งควรจะอยู่ในตารางของตนเอง

นอกจากนี้เพื่อเป็นการหลีกเลี่ยงข้อผิดพลาดในโบนัสโปรดแจ้งให้ทราบว่ามีการจัดรูปแบบหมายเลขโทรศัพท์ออกจากตาราง คุณควรหลีกเลี่ยงการเก็บรูปแบบของเขตข้อมูลเมื่อเป็นไปได้ทั้งหมด ในกรณีที่หมายเลขโทรศัพท์มีหลายวิธีที่ผู้ใช้เขียนหมายเลขโทรศัพท์: 215-555-5858 หรือ (215) 555-5858 นี้จะทำให้การค้นหาคนขายโดยหมายเลขโทรศัพท์ของพวกเขาหรือการค้นหาของคนขายในรหัสพื้นที่เดียวกันยากขึ้น

ข้อผิดพลาดเกี่ยวกับฐานข้อมูล # 4: ไม่ใช้คีย์หลักที่ถูกต้อง

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

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

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

ข้อผิดพลาดเกี่ยวกับฐานข้อมูล # 5: ไม่ใช้อนุสัญญาตั้งชื่อ

นี่อาจไม่ใช่เรื่องใหญ่เมื่อคุณเริ่มต้นออกแบบฐานข้อมูลของคุณ แต่เมื่อคุณได้รับคำถามเกี่ยวกับฐานข้อมูลเพื่อเรียกค้นข้อมูลการตั้งชื่อจะช่วยให้คุณจดจำชื่อฟิลด์

ลองนึกดูว่ากระบวนการนี้จะยากแค่ไหนถ้าชื่อถูกเก็บเป็น FirstName, LastName ในตารางเดียวและ first_name, last_name ในตารางอื่น

สองรูปแบบการตั้งชื่อที่เป็นที่นิยมมากที่สุดคือการใช้อักษรตัวพิมพ์ใหญ่ของคำทุกคำในฟิลด์หรือการแบ่งคำโดยใช้เครื่องหมายขีดล่าง นอกจากนี้คุณยังอาจเห็นนักพัฒนาบางรายใช้ตัวอักษรตัวแรกของทุกคำยกเว้นคำแรก: firstName, lastName

คุณยังต้องการตัดสินใจในการใช้ชื่อตารางเอกพจน์หรือชื่อตารางพหูพจน์ มันเป็นตารางสั่งซื้อหรือตาราง Orders? เป็นตารางลูกค้าหรือลูกค้าตาราง? อีกครั้งคุณไม่ต้องการติดกับตารางสั่งซื้อและตารางลูกค้า

อนุสัญญาการตั้งชื่อที่คุณเลือกไม่สำคัญเท่ากับกระบวนการเลือกและยึดติดกับการตั้งชื่ออย่างแท้จริง

ความผิดพลาดของฐานข้อมูล # 6: การจัดทำดัชนีที่ไม่เหมาะสม

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

แต่สิ่งที่มักพลาดคือสาขาอื่น ๆ ฟิลด์เหล่านี้คือฟิลด์ "ที่ไหน" หากคุณมักจะ จำกัด การค้นหาโดยใช้ฟิลด์ในประโยค WHERE คุณต้องการคิดเกี่ยวกับการวางดัชนีในฟิลด์นั้น อย่างไรก็ตามคุณไม่ต้องการจัดทำดัชนีตารางมากเกินไปซึ่งอาจส่งผลต่อประสิทธิภาพ

วิธีการตัดสินใจ? นี่เป็นส่วนหนึ่งของศิลปะการออกแบบฐานข้อมูล ไม่มีข้อ จำกัด อย่างหนักเกี่ยวกับจำนวนดัชนีที่คุณควรวางไว้บนโต๊ะ ขั้นต้นคุณต้องการจัดทำดัชนีฟิลด์ใด ๆ ที่ใช้บ่อยๆในคำสั่ง WHERE อ่านเพิ่มเติมเกี่ยวกับการทำดัชนีฐานข้อมูลของคุณอย่างถูกต้อง