0Pricing
SQL Interview Prep · บทเรียน

การทำให้เป็นบรรทัดฐานจนถึง 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_email
  • product_id -> product_name, unit_price
  • order_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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การทำให้เป็นบรรทัดฐานจนถึง 3NF
  2. การสร้างแบบจำลอง ER และคาร์ดินาลิตีของความสัมพันธ์
  3. สคีมาแบบดาวและการออกแบบคลังข้อมูล
  4. ชุดโจทย์สัมภาษณ์จำลองฉบับเต็ม
← กลับไปที่ SQL Interview Prep