ช่วยผมเรื่อง ฐานข้อมูลด้วยครับ เรียนไม่รู้เรื่องครับ เลยทำไม่ได้

เริ่มโดย ab2f6, 11 กรกฎาคม 2010, 16:16:17

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

ab2f6



ผมไม่เข้าใจ การทำ NORMALLIZRELATION

จากข้อมูลที่ผมมีเลยครับ  ผมไม่เข้าใจที่อาจารย์สอนมากๆเลยครับ (เป็นหนูทดลองของอาจารย์ สอนครั้งแรกครับ)

แล้วก็มีการเลือก key  อีกครับ

รบกวนพี่ๆช่วยแนะนำ ด้วยนะครับ

ถ้างานเสร็จแล้ว ผมจะกลับมา +1  ให้ทุกคนครับ

วันพุทธนี้ก็จะลองเอาไปส่งครับ
ส่งทีละขั้นตอน

bompople

[direct=https://wwv.onlygroub.com]ข่าวหนัง[/direct]
[direct=https://catweb.in.th]CATWEB[/direct]

ConfirmGroup

[direct=http://confirmgroup.com]ConfirmGroup Thailand เป็นนิติบุคคลถูกต้องตามกฏหมาย จึงมั่นใจ และเชื่อถือได้[/direct]
[direct=http://hostconfirm.com].[/direct][direct=http://californiascents.asia].[/direct] [direct=http://coms.co.th].[/direct] [direct=http://seoconfirm.com].[/direct]ขายโดเมนไม่ใช้งาน  Soldbuzz.com  อายุ  6 ปี   ราคา  750 บาท


หนุ่มบ้านโคก

การทำ NORMALLIZRELATION คือการลดความซ้ำซ้อนของข้อมูลในฐานข้อมูล แต่........ผมไม่เคยทำเลยเพราะเวลาที่จะเขียนระบบอะไรผมก็จะนึกเอาในหัวแล้วก็ทำ ๆๆๆ แก้ ๆๆ :P แล้วจะพูดทำไม :-X :-X
รอท่านอื่นก่อนน่ะครับ

thenetxx

คือการแยกย่อยตารางครับ เพื่อรองรับ relation แบบ M-M หรือ 1-M ข้อมูลไหนที่มันซ้ำซ้อนใช้เหมือน ๆ เดิม ก็ให้แยก table ออกมาเท่านั้น

เช่น จังหวัด แยกออกมา เป็น table จังหวัด ก็จะมี field หลัก

Table province -> province_id,province_name <<< จะมี 76 record
Table speed
Table isp
Table spu

แล้วtable user จะเก็บแต่ข้อมูลที่ unique

ถ้าเป็นแบบ  M-M ใน Table user จะเก็บแค่  user_id,user_name,age,email

แล้วแยก relational เพิ่ม อีก 1 tbl อาจจะชื่อว่า user_info_relation เก็บ user_id,province_id,isp_id,speed_id,spu_id  ครับ

เวลาต้องการลิ้งข้อมูล ก็แค่เพิ่มเข้าไปใน user_info_relation เพื่อเก็บ id ของทุกอย่างครับ หากไม่ลิ้ง ก็ลบออก

Develop site but can't develop life
ASIA

thenetxx

ในการเขียนโปรแกรมทั่วไป อาจไม่ค่อยต้องคำนึงจุดนี้ครับ

แต่หากวันนึง ธุรกิจมี Transaction ที่ต้องรองรับการใช้งานจำนวนมาก เป็นแสน เป็นล้าน records ถ้าไม่ทำ database ก็จะบวม และเปลือง resource ครับ อีกทั้งการ Backup ยังทำได้ช้ากว่ามาก ใช้เวลา query สูง สุดท้าย เครื่องก็จะกิน cpu และต้องเพิ่มเครื่องและอื่น ๆอีกมากมาย
Develop site but can't develop life
ASIA

เกมส์เกมส์.com

[direct=http://www.thaiseoboard.com/index.php/topic,191657.0.html]##โปรโมชั่น ## seo ลุ้นเสียว 1000 บาท/คีย์ +++  3คีย์แถม 1 คีย์+++ รับทำ seo แฟนเพจ top 10 เพียง 3000/คีย์[/direct]

ab2f6

อ้างถึงจาก: thenetxx ใน 11 กรกฎาคม 2010, 16:30:14
คือการแยกย่อยตารางครับ เพื่อรองรับ relation แบบ M-M หรือ 1-M ข้อมูลไหนที่มันซ้ำซ้อนใช้เหมือน ๆ เดิม ก็ให้แยก table ออกมาเท่านั้น

เช่น จังหวัด แยกออกมา เป็น table จังหวัด ก็จะมี field หลัก

Table province -> province_id,province_name <<< จะมี 76 record
Table speed
Table isp
Table spu

แล้วtable user จะเก็บแต่ข้อมูลที่ unique

ถ้าเป็นแบบ  M-M ใน Table user จะเก็บแค่  user_id,user_name,age,email

แล้วแยก relational เพิ่ม อีก 1 tbl อาจจะชื่อว่า user_info_relation เก็บ user_id,province_id,isp_id,speed_id,spu_id  ครับ

เวลาต้องการลิ้งข้อมูล ก็แค่เพิ่มเข้าไปใน user_info_relation เพื่อเก็บ id ของทุกอย่างครับ หากไม่ลิ้ง ก็ลบออก



ยังงงนิดนึง  แต่เป็นข้อมูลที่ดีมากเลยครับ
ผมจะพยามยามทำความเข้าใจ แล้วนำมาทำครับ

ขอบคุณมากๆๆครับ

ab2f6

อ้างถึงจาก: thenetxx ใน 11 กรกฎาคม 2010, 16:33:39
ในการเขียนโปรแกรมทั่วไป อาจไม่ค่อยต้องคำนึงจุดนี้ครับ

แต่หากวันนึง ธุรกิจมี Transaction ที่ต้องรองรับการใช้งานจำนวนมาก เป็นแสน เป็นล้าน records ถ้าไม่ทำ database ก็จะบวม และเปลือง resource ครับ อีกทั้งการ Backup ยังทำได้ช้ากว่ามาก ใช้เวลา query สูง สุดท้าย เครื่องก็จะกิน cpu และต้องเพิ่มเครื่องและอื่น ๆอีกมากมาย

อาจารย์เขาให้ทำตามหลักสูตรที่ท่านสอน

ผมก็ไม่เข้าใจเหมือนกันคับ

ข้อมูลผมนิดเดียวเอง

@@@

user(รหัสสมาชิก,ชื่อผู้ใช้,อายุ,รหัสจังหวัด,อีเมล์,รหัสisp,รหัสspd,รหัสspu)
province(รหัสจังหวัด,ชื่อจังหวัด)
isp(รหัสisp,ชื่อisp)
spd(รหัสspd,ชื่อspd)
spu(รหัสspu,ชื่อspu)


ช้าไปมั้ยคับ  :wanwan004:
รับซื้อเว็บ 100uip ต่อวันขึ้นไป [direct=http://www.rommit.com/forex]EA Forex[/direct]

Joejoe


ง่ายๆ ครับการทำ NF คือการลดความซ้ำซ้อนของข้อมูล โดยกระบวนการ NF นั้นมี ตั้งแต่ระดับ 1NF จนไปถึง 5NF ( ใช้งานจริงๆ คงแค่ 2-3 NF เองครับในกรณีที่ข้อมูลไม่ซับซ้อนมาก) 

โดยวิธีการสังเกตุง่ายๆ ครับคือ หาก talbe ไหนมีข้อมูลที่ซ้ำซ้อนอยู่แสดงว่า ต้องมีการดำเนินการ NF ในขั้นต่อไปครับ เพราะอะไร ลองนึกดูนะครับว่า หากข้อมูลใดใน table ที่ไม่มีการ NF เลย ข้อมูลที่เก็บก็จะมีความซ้ำซ้อนกันมาก (ลองดูจากโจทย์ที่ได้มานะครับ ตัวอย่างก็ จังหวัดขอนแก่น มีเยอะมากซ้ำซ้อน)
หากวันใดวันหนึ่ง มีการแก้ไข เปลี่ยนแปลงสักนิด   record อื่น ๆ ที่มีข้อมุลแบบเดียวกันไม่ต้องไปตามแก้กันทุก record หรือครับ จริงไหม ??


ตัวอย่างง่าย ๆ ครับ เช่น ในโจทย์ที่ท่านได้มามี สมาชิก ที่อยู่จังหวัด ข่อนแก่น อยู่ ประมาณ 8 record ( หรืออาจมีมากกว่านั้น ) สมมติว่า ต้องการแก้ไข จาก จังหวัดขอนแก่น เป็น จ.ขอนแก่น ท่านไม่ต้องตามไปแก้กันครบทุก record ตามจำนวนสมาชิกที่อยู่ จังหวัดขอนแก่น หรือครับ   ( นึกออกแล้วใช่ปะคับ )  ดังนั้น คุณควรแยกออกมา โดย แยกเก็บจังหวัดออกเป็นอีก table หนึ่ง โดยเก็บเฉพาะ รหัสจังหวัด และ ชื่อจังหวัด ก็จะได้

provinceid (PK), provincename

เราก็จะมีจังหวัดขอนแก่น เพียง record เดียว อ่าวแล้วจะ เชื่อมโยง และเอาไปใช้กันยังไงละ ?? ก็แบบนี้ครับ ใน table ของสมาชิกแทนที่จะเก็บเป็นชื่อจังหวัด ก็เลือกเก็บเป็นรหัสของจังหวัดแทน ( ก็จะเป็น FK ) ทีนี่ถ้าต้องการแก้ไขจาก จังหวัดขอนแก่น เป็น จ.ขอนแก่น ก็ไปแก้ที่เดียวครับ ที่  table province  ทีนี้ข้อมูลสมาชิกก็จะถูกต้อง และตรงกันแล้วครับ

เพราะทุกตารางที่ทำการ NF ออกมาจะมีความสัมพันธ์ของข้อมูลกัน อย่างที่หลายๆ ท่านได้อธิบายไปแล้ว 1-m , M-M

อ่อ ส่วนการเลือก PK ง่ายๆ ครับ ต้องเลือกหรือกำหนด ให้  PK โดยที่ PK จะต้องไม่มีการซ้ำซ้อนกันครับ ตัวอย่างเช่น จากโจทย์ สิ่งที่ไม่ซ้ำซ้อนใน table สมาชิก ก็คือ รหัสสมาชิกครับ

*PK is Primarykey คีย์หลัก


เฮียเล้ง

เอาแบบง่ายๆคือ

แทนที่จะใส่ "ข่อนแก่น" ให้ใส่ 1 แทน
แล้วจะให้ 1 แปลว่าไร ก็ไปสร้างอีกตาราง ex. 1=ขอนแก่น, 2=กทม

ทีนี้สมมุติเขียนผิด "ขอนแก่" จะแก้เป็น "ขอนแก่น" ก็แก้ที่ 1=ขอนแก่ เป็น 1=ขอนแก่น แทน แก้ที่เดียว ไม่ต้องวนแก้ทุก record

ประหยัดการทำงานไปเยอะ เป็น 1 ในวิธีการ normalization ที่พี่ๆ ข้างบนบอกนั้นแหละ

แล้วก็ทำแบบนี้กับข้อมูลทุกฟิวที่ซ้ำๆ กันแบบนี้
[direct=http://ประตูไม้สัก.net]ประตูไม้สัก[/direct] [direct=http://ประตูไม้สัก.net]เฟอร์นิเจอร์ไม้สัก[/direct]

imodernlamp

เอาง่ายๆ สั้นๆ DB Normalize ทำให้มันเป็นปกติแบบชาวบ้านเค้าคับ  :P
โดยแบ่งการ Normalize ได้เป็นระดับ ซึ่งถามว่าควรจะ Normalize ให้อยู่ระดับใดแล้วแต่จุดประสงค์การใช้งานครับ

1NF: ข้อมูลในแต่ละแถว,คอลัมภ์มีแค่ 1 ค่า ถ้ามองในมุม Excel ถ้าใน 1 ช่องมีข้อมูลแค่บรรทัดเดียวก็ถือเป็น 1NF แล้ว (ตามตารางที่ให้มาก็ถือว่าเป็น 1NF แล้ว)
2NF: Table 1(รหัสสมาชิก, ชื่อผู้ใช้, อายุ, จังหวัด, อีเมลล์, ISP, SPD, SPU)
3NF: Table 1(รหัสสมาชิก, ชื่อผู้ใช้, อายุ, จังหวัด, อีเมลล์, ISP, SPD, SPU)
BCNF: Table 1(รหัสสมาชิก, อายุ, จังหวัด, อีเมลล์, ISP, SPD, SPU)
       Table 2(รหัสสมาชิก, ชื่อผู้ใช้)
4NF: Table 1(รหัสสมาชิก, อายุ, จังหวัด, อีเมลล์, ISP, SPD, SPU)
       Table 2(รหัสสมาชิก, ชื่อผู้ใช้)
5NF: Table 1(รหัสสมาชิก, อายุ, จังหวัด, อีเมลล์, ISP, SPD, SPU)
       Table 2(รหัสสมาชิก, ชื่อผู้ใช้)

อ้างอิงจาก Link นี้ลองศึกษาดูนะครับ http://std.kku.ac.th/5150200504/Nomalization.pdf

ปล. เสริมอีกนิดนึง การเพิ่มพวกรหัสทั้งหลายเช่นรหัสสมาชิก รหัสจังหวัด รหัส ISP ไม่ใช่การ Normalize นะครับ เป็นการกำหนด Attribute ที่อยู่ตั้งแต่ step DB Design เพื่อให้โครงสร้างของ DB ดีขึ้นครับ

ผิดถูกช่วยชี้แนะด้วยครับ  :P
ขอบคุณทุกๆ ความรู้จาก ไทยเสียวบอร์ด ครับ

[direct=http://www.xn--42c1bzah7fqeqa1e.com]ทำโคมไฟ[/direct]
[direct=http://www.i-modernlamp.com]โคมไฟ[/direct]
[direct=http://www.xn--12cfk8cb1dn3xdw3c.com]รับทำโคมไฟผ้า งานคุณภาพ[/direct]
[direct=http://www.โคมไฟตกแต่ง.com]โคมไฟ[/direct]

puiiz_zz


ohmohm


หนึ่งสุดหล่อ


การทำ Normalization ก็คือการจัดระเบียบให้กับฐานข้อมูล เพื่อประโยชน์หลายๆอย่าง เช่นเพิ่มความเร็วในการ query (ทั้ง add edit delete) และลดความซ็ำซ้อนกันในฐานข้อมูล บางครั้งข้อมูลนิดเดียวมันมองไม่ออก ขอให้นึกถึงข้อมูลประชากรไทย สมมุติว่าไม่มีการออกแบบที่ดีเลย แล้วดันเก็บชื่อจังหวัดผิดไปหลายคน แล้วไม่เหมือนกันอีก เช่นแค่ใส่ว่า กรุงเทพฯ กรุงเทพ กทม ก็ไม่เหมือนกันแล้ว จะเกิดปัญหาขึ้นทันที จะต้องใช้เวลานานมากในการแก้ไข เลยมีคนนึงคิดระบบ NF ขึ้นมาเพื่อเป็นตัวช่วยเหลือในการออกแบบดาต้าเบส

1NF - ทุก ๆ field ในแต่ละ record จะเป็น single value  นั่นคือ  ในตารางหนึ่ง ๆ จะไม่มี ค่าของกลุ่ม  ข้อมูลที่ซ้ำกัน (Repeating Group)

2NF - ต้องเป็น First Normal Form (1NF) และต้องมี key (บางตำรา อาจจะเรียกว่า index) ที่ทุก Non-key จะต้องขึ้นอยู่ (depends on) กับ key นี้  และมีเพียง key เดียวในหนึ่งตาราง ซึ่งเรียกว่า Primary Key  การที่ทุกตาราง (Table) ต้องมี Key ก็เพราะเราต้องการให้แน่ใจว่าทุกข้อมูลใน record ต่าง ๆ สามารถค้นหาได้โดยใช้  key

3NF - ต้องเป็น  Second  Normal Form (2NF) และ ไม่มี Transitive dependence  หรือ เป็นการขจัดแอตตริบิวที่ไม่เป็นคีย์ที่ขึ้น ( Transitive dependent ) ตรงกับแอตตริบิวอื่นที่ไม่ใช่คีย์หลักออกไป  เพื่อให้แอตตริบิวที่ไม่ใช่คีย์หลักต้องขึ้นตรงกับทั้งส่วนที่เป็นคีย์หลัก  และไม่ขึ้นกับแอตตริบิวอื่นที่ไม่ใช่คีย์หลัก

BCNF - ต้องเป็น 3NF และไม่มี attribute อื่นในรีเลชันที่สามารถระบุค่าของ attribute ที่เป็นคีย์หลัก หรือส่วนหนึ่งส่วนใดของคีย์หลักในกรณีที่คีย์หลักเป็นคีย์ผสม

4NF - ต้องอยู่ในรูปแบบ BCNF และเป็นรีเลชันที่ไม่มีความสัมพันธ์ในการระบุค่าของ attribute แบบหลายค่า โดยที่ attribute ที่ถูกระบุค่าเหล่านี้ไม่มีความสัมพันธ์กัน (Independently Multivalued Dependency)

5NF - ต้องอยู่ในรูปแบบ 4NF และไม่มี Symmetric Constraint กล่าวคือ หากมีการแตกรีเลชันออกเป็นรีเลชันย่อย (Projection) และเมื่อทำการเชื่อมโยงรีเลชันย่อยทั้งหมด (Joint) จะไม่ก่อนให้เกิดข้อมูลใหม่ที่ไม่เหมือนรีเลชั่นเดิม (Spurious Tupes)

   ในการแตกรีเลชันออกมาจากรูปแบบ 4NF นั้น ถ้าทำการเชื่อมโยงรีเลชันย่อยนั้นใหม่ หากไม่มีข้อมูลที่แตกต่างไปจากรีเลชันเดิม ก็จะสามารถแตกรีเลชันนั้นได้ แต่ถ้าหากแตกเป็นรีเลชันย่อยแล้วเกิดข้อมูลไม่เหมือนกับรีเลชันเดิม ก็ไม่ควรแตกรีเลชัน และให้ถือว่ารีเลชันเดิมอยู่ใน 5NF แล้ว

เอาไปใช้งานจริงๆ แค่ได้ 2-3NF ก็เกินพอแล้ว แต่ถ้าเอาไปเพื่อเรียน ยังไงก็ต้องทำให้ได้ทุก NF ครับ

ปล. อาจารย์ไม่เก่ง แล้วเพื่อนๆที่เรียนล่ะครับ ไม่มีใครรู้เรื่องเลยเหรอ
:wanwan017:

ZyZee

แล้วตารางแบบนี้เรียกว่าอะไรหรอครับ   

คน              สี 

ผมบ๊อบ        สีน้ำเงิน
ผมบ๊อบ        สีแดง
Jane           สีเขียว
Jane           สีเหลือง
Jane           สีแดง
***ชีวิตไม่สามารถ Undo ได้ อย่ามัวเสียเวลากับอดีตที่ไม่มีหวนกลับ***
อย่ามัวคิดว่าตัวเองโชคร้าย...เพราะเวลาของเรามีค่ามีค่ามากเกินกว่าจะมั่วมานั่งสงสารตัวเอง
++++อย่ามัวเสียเวลาใช้ชีวิตตามคนอื่น+++

sanotti

ดูจากตารางแล้ว ไม่เห็นวัตถุประสงค์ ก็ทำ Normalize ไม่ได้เช่นกันครับ เพราะการทำ Normalize ต้องอิงวัตถุประสงค์ในการใช้งานดาต้าเบสเป็นหลัก เห็นแค่นี้ตอบไปผิดวัตถุประสงค์จะพาลโดนหักคะแนนเปล่าๆ :wanwan044:

แต่ถ้าเป็นผมจะทำประมาณ 2 ตาราง
user info
ISP table

ลองไปแยกเองนะครับไม่น่ายาก
ไม่ลืมไม่มีหรอก..มีแต่ลืมช้ากับลืมเร็ว.......