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