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