การทำให้เป็นบรรทัดฐานจนถึง 3NF
รูปแบบบรรทัดฐานระดับที่หนึ่ง สอง และสาม พร้อมความผิดปกติที่แต่ละระดับช่วยกำจัด
การทำให้เป็นบรรทัดฐานจนถึง 3NF เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
เหตุผลที่ผู้สัมภาษณ์ถามเกี่ยวกับการทำให้เป็นบรรทัดฐาน
การทำให้เป็นบรรทัดฐานเป็นรากฐานสำคัญของการสร้างแบบจำลองฐานข้อมูล และผู้สัมภาษณ์ใช้คำถามนี้เพื่อทดสอบว่าคุณเข้าใจ ความถูกต้องครบถ้วนของข้อมูล ในระดับการออกแบบหรือไม่ คำถามมักฟังดูประมาณว่า: "การทำให้เป็นบรรทัดฐานคืออะไร และเหตุใดจึงสำคัญ"
การทำให้เป็นบรรทัดฐานคือกระบวนการจัดระเบียบคอลัมน์และตารางเพื่อ ลดความซ้ำซ้อน และป้องกันความผิดปกติจากการปรับปรุง การแทรก และการลบข้อมูล แต่ละ รูปแบบบรรทัดฐาน (1NF, 2NF, 3NF) จะเพิ่มกฎที่เข้มงวดขึ้น
คำตอบที่ดีควรระบุความผิดปกติที่การทำให้เป็นบรรทัดฐานช่วยกำจัดได้ ไม่ใช่เพียงให้คำจำกัดความตามตำรา
ความผิดปกติสามประการ
ก่อนเรียนรู้รูปแบบบรรทัดฐาน ควรทำความเข้าใจก่อนว่ารูปแบบเหล่านี้ช่วยแก้ปัญหาอะไร ตารางที่ออกแบบไม่ดีซึ่งเก็บทุกอย่างไว้ในที่เดียวจะประสบกับความผิดปกติสามประการ:
- ความผิดปกติจากการปรับปรุงข้อมูล: ข้อเท็จจริงเดียวกันถูกเก็บไว้ในหลายแถว ดังนั้นเมื่อมีการเปลี่ยนแปลงจึงต้องแก้ไขทุกแถว มิฉะนั้นข้อมูลจะไม่สอดคล้องกัน
- ความผิดปกติจากการแทรกข้อมูล: คุณไม่สามารถเพิ่มข้อเท็จจริงหนึ่งรายการได้โดยไม่ต้องระบุข้อมูลอื่นที่ไม่เกี่ยวข้องไปพร้อมกัน (เช่น ไม่สามารถเพิ่มผลิตภัณฑ์โดยไม่มีคำสั่งซื้อ)
- ความผิดปกติจากการลบข้อมูล: การลบแถวหนึ่งโดยไม่ตั้งใจทำให้ข้อเท็จจริงอิสระอีกเรื่องถูกลบไปด้วย
หากคุณมองเห็นความผิดปกติเหล่านี้ในตารางตัวอย่างได้ คุณก็จะอธิบายเหตุผลของทุกขั้นตอนในการทำให้เป็นบรรทัดฐานได้
ตารางเริ่มต้นที่ยังไม่ผ่านการทำให้เป็นบรรทัดฐาน
นี่คือตัวอย่างคลาสสิกในการสัมภาษณ์: ตารางขนาดใหญ่ตารางเดียวที่รวมคำสั่งซื้อ ลูกค้า และผลิตภัณฑ์เข้าด้วยกัน โปรดสังเกตอีเมลของลูกค้าและราคาผลิตภัณฑ์ที่ปรากฏซ้ำในหลายแถว นี่คือจุดที่เกิดความผิดปกติต่าง ๆ
หน้าที่ของคุณในการสัมภาษณ์คือค่อย ๆ ปรับตารางนี้จนถึง 3NF พร้อมอธิบายการแยกตารางแต่ละครั้ง
-- Unnormalized: everything in one table
CREATE TABLE orders_flat (
order_id INT,
customer_id INT,
customer_email VARCHAR(255),
product_id INT,
product_name VARCHAR(100),
unit_price DECIMAL(10,2),
quantity INT
);รูปแบบบรรทัดฐานที่หนึ่ง (1NF)
1NF กำหนดให้แต่ละคอลัมน์เก็บค่าเดี่ยวเพียงค่าเดียว และไม่มีกลุ่มข้อมูลซ้ำหรืออาร์เรย์อยู่ภายในเซลล์
ตารางจะละเมิด 1NF หากคอลัมน์หนึ่งเก็บรายการที่คั่นด้วยจุลภาค เช่น 'phone1, phone2' หรือมีคอลัมน์ product1, product2, product3
วิธีแก้คือให้แต่ละค่าอยู่ในแถวของตนเอง ผู้สัมภาษณ์ต้องการได้ยินว่า "ค่าเดี่ยว ไม่มีกลุ่มข้อมูลซ้ำ และมีคีย์ที่ระบุแต่ละแถว"
-- Violates 1NF: a list inside one column
-- phones = '555-1111, 555-2222'
-- 1NF fix: one phone per row
CREATE TABLE customer_phone (
customer_id INT,
phone VARCHAR(20),
PRIMARY KEY (customer_id, phone)
);การขึ้นต่อกันเชิงฟังก์ชัน
ในการอธิบาย 2NF และ 3NF คุณต้องใช้คำว่า การขึ้นต่อกันเชิงฟังก์ชัน เราเขียน A -> B เพื่อหมายความว่า "A เป็นตัวกำหนด B": สำหรับค่าแต่ละค่าของ A จะมีค่าของ B ได้เพียงค่าเดียว
ในตารางคำสั่งซื้อของเรา:
customer_id -> customer_emailproduct_id -> product_name, unit_priceorder_id, product_id -> quantity
แท้จริงแล้วการทำให้เป็นบรรทัดฐานคือการตรวจสอบให้แน่ใจว่าคอลัมน์ที่ไม่ใช่คีย์ทุกคอลัมน์ขึ้นต่อกับ คีย์ทั้งหมด และไม่ขึ้นต่อกับสิ่งอื่นนอกจากคีย์
รูปแบบบรรทัดฐานที่สอง (2NF)
2NF ใช้เมื่อคีย์หลักเป็น คีย์ประกอบ โดยห้ามคอลัมน์ที่ไม่ใช่คีย์ขึ้นต่อกับเพียง บางส่วน ของคีย์ (การขึ้นต่อบางส่วน)
คีย์ของรายการสินค้าในคำสั่งซื้อของเราคือ (order_id, product_id) แต่ product_name และ unit_price ขึ้นต่อกับ product_id เท่านั้น ไม่ได้ขึ้นต่อกับคีย์ทั้งหมด นี่คือการขึ้นต่อบางส่วน จึงละเมิด 2NF
วิธีแก้คือย้ายแอตทริบิวต์ของผลิตภัณฑ์ไปไว้ในตาราง products ซึ่งใช้ product_id เป็นคีย์
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100),
unit_price DECIMAL(10,2)
);
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);รูปแบบบรรทัดฐานที่สาม (3NF)
3NF กำจัด การขึ้นต่อแบบถ่ายทอด: คอลัมน์ที่ไม่ใช่คีย์ขึ้นต่อกับคอลัมน์ที่ไม่ใช่คีย์อีกคอลัมน์หนึ่ง แทนที่จะขึ้นต่อกับคีย์โดยตรง
สมมติว่าตาราง orders มีทั้ง customer_id และ customer_email ในกรณีนี้ order_id -> customer_id -> customer_email อีเมลขึ้นต่อกับคีย์ผ่าน customer_id เท่านั้น จึงเป็นการขึ้นต่อแบบถ่ายทอด
วิธีแก้คือแยกลูกค้าไปไว้ในตารางของตนเอง จากนั้นคอลัมน์ที่ไม่ใช่คีย์ในแต่ละตารางจะขึ้นต่อกับคีย์ของตารางนั้นเท่านั้น
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_email VARCHAR(255)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);หลักช่วยจำในหนึ่งบรรทัด
ผู้สัมภาษณ์ชื่นชอบผู้สมัครที่สามารถสรุป 3NF ได้ในประโยคเดียว ถ้อยคำคลาสสิกคือ:
"คอลัมน์ที่ไม่ใช่คีย์ทุกคอลัมน์ต้องขึ้นต่อกับคีย์ คีย์ทั้งหมด และไม่มีสิ่งอื่นนอกจากคีย์"
- คีย์ -> 1NF (มีคีย์และมีค่าเดี่ยว)
- คีย์ทั้งหมด -> 2NF (ไม่มีการขึ้นต่อบางส่วน)
- ไม่มีสิ่งอื่นนอกจากคีย์ -> 3NF (ไม่มีการขึ้นต่อแบบถ่ายทอด)
บรรทัดเดียวนี้ช่วยให้คุณนึกย้อนสร้างรูปแบบบรรทัดฐานทั้งสามได้เมื่อต้องการ
BCNF: คำถามต่อยอด
ผู้สัมภาษณ์ที่เจาะลึกอาจถามเกี่ยวกับ รูปแบบบรรทัดฐานบอยซ์-คอดด์ (BCNF) ซึ่งเป็นรูปแบบที่เข้มงวดกว่า 3NF
BCNF กำหนดว่าสำหรับการขึ้นต่อกันเชิงฟังก์ชันทุกกรณี X -> Y นั้น X ต้องเป็น ซูเปอร์คีย์ 3NF ยอมรับข้อยกเว้นที่พบได้ยากเมื่อแอตทริบิวต์ที่ถูกกำหนดเป็นส่วนหนึ่งของคีย์ตัวเลือก แต่ BCNF ไม่ยอมรับแม้แต่ข้อยกเว้นนั้น
ในทางปฏิบัติ คุณอาจไม่ค่อยพบการละเมิด BCNF แต่การเอ่ยถึง BCNF และกล่าวว่า "BCNF คือ 3NF ที่ไม่มีข้อยกเว้นสำหรับแอตทริบิวต์ของคีย์ตัวเลือก" จะแสดงให้เห็นว่าคุณมีความเข้าใจอย่างลึกซึ้ง
เมื่อไม่ควรทำให้เป็นบรรทัดฐาน (NOT)
คำตอบในระดับผู้มีประสบการณ์ควรยอมรับว่ามีข้อแลกเปลี่ยน การทำให้เป็นบรรทัดฐานช่วยเพิ่มความถูกต้องครบถ้วนของข้อมูล แต่อาจทำให้ประสิทธิภาพการอ่านลดลง เพราะการตอบคำถามหนึ่งรายการต้องใช้ การเชื่อมตาราง มากขึ้น
การทำให้ไม่เป็นบรรทัดฐานโดยมีจุดประสงค์เป็นสิ่งที่ยอมรับได้เมื่อ:
- ปริมาณงานเน้นการอ่าน และการเชื่อมตารางเป็นคอขวด
- คุณกำลังสร้างชั้นการวิเคราะห์/การรายงาน (เช่น แบบจำลองดาว ซึ่งจะกล่าวถึงภายหลัง)
- คุณสามารถทำให้สำเนาที่ซ้ำซ้อนยังคงสอดคล้องกันได้ (ทริกเกอร์, ETL, มุมมองที่เก็บผลลัพธ์)
ให้กล่าวว่า: "ทำให้เป็นบรรทัดฐานเพื่อความถูกต้องครบถ้วนของ OLTP; ทำให้ไม่เป็นบรรทัดฐานอย่างมีจุดประสงค์เพื่อความเร็วในการอ่านของ OLAP"
การอธิบายบนกระดาน
ลองนำทุกอย่างมารวมกัน ในการสัมภาษณ์จริง เมื่อได้รับตารางที่ยุ่งเหยิง:
- ระบุคีย์ตัวเลือกและแจกแจงการขึ้นต่อกันเชิงฟังก์ชัน
- ตรวจสอบการมีค่าเดี่ยวและกลุ่มข้อมูลซ้ำ (1NF)
- หากคีย์เป็นคีย์ประกอบ ให้ตรวจสอบการขึ้นต่อบางส่วน (2NF)
- ตรวจสอบการขึ้นต่อระหว่างคอลัมน์ที่ไม่ใช่คีย์ (3NF)
- วาดตารางที่ได้พร้อมคีย์หลักและคีย์ต่างประเทศ
การอธิบายขั้นตอนเหล่านี้ออกเสียงคือสิ่งที่ผู้สัมภาษณ์ใช้ประเมินโดยตรง
ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับรูปแบบบรรทัดฐาน
ทบทวน: การทำให้เป็นบรรทัดฐานจนถึง 3NF
ตอนนี้คุณสามารถตอบคำถามสัมภาษณ์ยอดนิยมเกี่ยวกับการทำให้เป็นบรรทัดฐานได้ตั้งแต่ต้นจนจบ:
- การทำให้เป็นบรรทัดฐานกำจัด ความผิดปกติจากการปรับปรุง การแทรก และการลบข้อมูล ด้วยการลดความซ้ำซ้อน
- 1NF: ค่าเดี่ยว ไม่มีกลุ่มข้อมูลซ้ำ
- 2NF: ไม่มีการขึ้นต่อบางส่วนบนคีย์ประกอบ
- 3NF: ไม่มีการขึ้นต่อแบบถ่ายทอด (ระหว่างคอลัมน์ที่ไม่ใช่คีย์)
- สรุปว่า "คีย์ คีย์ทั้งหมด และไม่มีสิ่งอื่นนอกจากคีย์"
- BCNF ทำให้ 3NF เข้มงวดขึ้น ส่วนการทำให้ไม่เป็นบรรทัดฐานควรทำอย่างมีจุดประสงค์สำหรับการวิเคราะห์ที่เน้นการอ่าน
คำถามที่พบบ่อย
บทเรียน “การทำให้เป็นบรรทัดฐานจนถึง 3NF” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การทำให้เป็นบรรทัดฐานจนถึง 3NF” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การทำให้เป็นบรรทัดฐานจนถึง 3NF”
รูปแบบบรรทัดฐานระดับที่หนึ่ง สอง และสาม พร้อมความผิดปกติที่แต่ละระดับช่วยกำจัด คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การทำให้เป็นบรรทัดฐานจนถึง 3NF” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Interview Prep นี้ได้ไหม
ได้ บทเรียน SQL Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การทำให้เป็นบรรทัดฐานจนถึง 3NF
- การสร้างแบบจำลอง ER และคาร์ดินาลิตีของความสัมพันธ์
- สคีมาแบบดาวและการออกแบบคลังข้อมูล
- ชุดโจทย์สัมภาษณ์จำลองฉบับเต็ม