รบกวนด้วยครับ ใครเก่ง database จะถามเรื่องการทำ normalization

กระทู้คำถาม
คือว่าผมจะ normalization ตารางทั้งหมดนี้ ให้อยู่ในฟอร์ม 1NF 2NF 3NF ตามลำดับน่ะครับ งงมากๆเลย รบกวนผู้รู้ทีครับ


1) ตาราง room
room_id    type    rate     description    image    qty    max_adult    max_child

2) ตาราง reservation
reservation_id    firstname    lastname    zip    province    country    email    contact    username    password    arrival    departure    adults    child    result    room_id    no_room    payable    status    confirmation

3) ตาราง roominventory
roominventory_id    arrival    departure    qty_reserve    room_id    confirmation    status

4) ตาราง user
user_id    username    password    position
คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 4
เรียนเรื่อง normalization ถ้าคุณไม่ลงมือทำเอง ลงข้อมูลเอง อ่านอย่างเดียว คุณไม่มีทางรู้เรื่องครับ งงเป็นไก่ตาแตก
แต่ถ้าได้ลองทำเอง คิดเองหมด คุณจะพบว่าเรื่องนี้โครตง่าย common sense กันเลยทีเดียว

ท่องเอาไว้ครับ normalization คือ กำจัดการเก็บข้อมูลซ้ำซ้อน

ผมยกตัวอย่างให้ซักข้อ 1 ละกัน ตารางข้อ 1 room ถ้าคุณลองไปลงข้อมูลซัก 10 record ใน excel ดู
คุณจะรู้เลยว่าข้อมูลที่ลงโครตซ้ำซ้อนเลยครับ
(ถ้าคิดความหมายของแต่ละฟีลด์ตามที่ผมเข้าใจเอาเองนะ เพราะคุณไม่ได้บอกความหมายของแต่ละฟีลด์มา)
เพราะฟีลด์ rate , image , max_adult , max_child พวกนี้ คุณจะเห็นว่า มันขึ้นตรงกับฟีลด์ type (ประเภทห้อง)

คือสมมติว่า type ห้องมี 2 ประเภทคือ ธรรมดา กับ VIP
ถ้าห้องเป็นธรรมดา ,rate , image , max_adult , max_child พวกนี้จะเหมือนกันหมด คือเป็นของห้องธรรมดา
ถ้าเป็น VIP rate , image , max_adult , max_child ข้อมูลพวกนี้ก็ตามประเภทของห้อง VIP

สมมติว่าคุณมีห้องธรรมดา 100 ห้อง คุณจะพบว่าข้อมูลห้องธรรมดา 100 record ฟีลด์พวกนี้แมร่งซ้ำกันหมดเลย

มันก็ต้องแยกเก็บถูกไหมครับ แต่ว่าคุณต้องการทำ 3NF ด้วย ท่องจำไว้นะครับ 3NF ห้ามจัดเก็บข้อมูล"ดิบ" ซ้ำซ้อนกัน (โดยความหมายของฟีลด์)
ถ้ามี ต้องแยกเป็นตารางอื่นแล้วลิงค์ด้วย foreign key แทน

ทีนี้ช่อง type ของคุณ ปกติแล้วก็จะจัดเก็บประเภทห้องเป็น "ธรรมดา" , "VIP" ลงไปในฟีลด์ใช่ไหมครับ นี่แหละครับคือการจัดเก็บข้อมูลดิบ
ซ้ำซ้อนกัน เพราะว่าข้อมูลห้องธรรมดา 100 ห้อง ฟีลด์นี้ก็จะเก็บข้อความ "ธรรมดา" 100 record โครตเปลืองเลย

ดังนั้นตารางที่เราแยกจะต้องทำเป็น foreign key ลิงค์แทน ผมสมมติว่าชื่อตาราง room_type_detail นะครับ ก็จะมีฟีลด์ดังนี้
room_type_detail => room_type_id , type , rate , image , max_adult , max_child

ในตาราง room ก็จะเหลือแค่ room => room_id    room_type_id     description   qty
แค่นี้ครับ

จะเห็นว่าถ้าจัดเก็บแบบนี้ ตาราง room_type_detail จะมีแค่ 2 record คือ ธรรมดา กับ VIP
ส่วนตาราง room ก็เก็บตามจำนวนห้องที่มี แต่คราวนี้ ข้อมูลที่ซ้ำซ้อนก็จะมีแค่ room_type_id ที่เป็นประเภทห้อง เพียงแต่มันเป็น key
ก็อาจจะเก็บ 1 , 2 แทนก็ได้ ไม่จำเป็นต้องเก็บเป็น "ธรรมดา" , "VIP" แบบเต็ม ๆ ให้เปลืองพื้นที่จัดเก็บ


ถามว่าข้างบนถูกต้องไหม ผมบอกเลยว่า ไม่รู้ เพราะการทำ normalization คุณต้องรู้ว่าทุกฟีลด์จัดเก็บข้อมูลอะไร แบบไหน ถึงจะทำได้ถูกต้อง
ที่ผมทำข้างบนคือ "มโน" ความหมายของแต่ละฟีลด์ไปเองล้วน ๆ ดังนั้นไม่รู้ครับว่าถูกไหม
ซึ่งเอาจริง ๆ จะพบว่าข้างบนมีฟีลด์นึงที่ตีความหมายได้ 2 แบบ คือ image

ถ้าทำแบบผม คุณจะพบว่าผมตีความหมายว่า ประเภทห้อง 1 ห้อง จะมี image แค่ 1 รูป (ห้องธรรมดา 100 ห้อง ใช้รูปเดียวแทนห้องธรรมดาทั้งหมด)
แต่มันจะตีความหมายได้อีกแบบ คือ ห้อง 1 ห้องก็มีรูปเลย 1 รูป (ห้องธรรมดา 100 ห้อง ก็มีรูปห้องแต่ละห้องทั้งหมด รวมเป็นมี 100 รูป)

ซึ่งถ้าคนคิดโจทย์ตีความหมายเป็นแบบที่ 2 ที่ผมทำมาก็ผิดเลย เพราะ image ต้องย้ายกลับไปตาราง room ครับ

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