จำนวนการดูหน้าเว็บรวม

วันจันทร์ที่ 15 พฤศจิกายน พ.ศ. 2553

ระบบฐานข้อมูลคืออะไร?....................
ระบบฐานข้อมูล คือ ระบบจัดเก็บข้อมูลด้วยคอมพิวเตอร์โดยมีวัตถุประสงค์เพื่อบำรุงรักษาข้อสนเทศ (Maintain information) และสามารถนำข้อสนเทศเหล่านั้นมาใช้ได้ทุกเมื่อที่ต้องการ
ระบบฐานข้อมูลประกอบส่วนประกอบหลัก4 ส่วนได้แก่
1. ข้อมูล (Data) ข้อมูลในฐานข้อมูลจะต้องมีคุณสมบัติ 2 ประการ คือ
  • เบ็ดเสร็จ (Integrate) ฐานข้อมูลเป็นแหล่งรวบรวมข้อมูลจากแฟ้มต่าง ๆ ไว้ครบถ้วนสมบูรณ์ เพื่อลดข้อมูลซ้ำซ้อนระหว่างแฟ้ม
  • ใช้ร่วมกันได้ (Share) ข้อมูลแต่ละชิ้นในฐานข้อมูลสามารถนำมาแบ่งใช้กันได้ระหว่างผู้ใช้ต่าง ๆ ในระบบ
2. ฮาร์ดแวร์ (Hardware) ประกอบด้วย อุปกรณ์บันทึกข้อมูลเช่น จานแม่เหล็ก , I/O device , Device controller , I/O channels , หน่วยประมวลผล และหน่วยความจำหลัก
3. ซอฟต์แวร์ (Sorftware) ตัวกลางเชื่อมระหว่างฐานข้อมูลและผู้ใช้คือ DBMS เป็นซอฟต์แวร์ที่สำคัญที่สุดของระบบฐานข้อมูล นอกจากนี้ยังมี Utility , Application Develoment tool , Desisn aids , Report writers , ect.
4. ผู้ใช้ (Users) มี 3 กลุ่มใหญ่ ๆ คือ
  • Application Programmer เขียนโปรแกรมประยุกต์
  • End Users ผู้ใช้ที่อยู่กับ Online terminal เข้าถึงข้อมูลโดยผ่านโปรแกรมประยุกต์ หรือผ่านภาษาเรียกค้น (Query Language)
  • Data Addministrator & Database Administrator
DA ผู้บริหารอาวุโส เป็นผู้ตัดสินใจว่าจะเก็บข้อมูลใดในฐานข้อมูลก่อน และกำหนดนโยบายการรักษาความปลอดภัยของข้อมูล
DBA ผู้เชี่ยวชาญระดับมืออาชีพ เป็นผู้สร้างฐานข้อมูลและนำมาใช้งานจริง โดยควบคุมทางด้านเทคนิคที่จำเป็นในการดำเนินนโยบายที่กำหนดโดย DA
ข้อดีของการใช้ฐานข้อมูล
  • กระทัดรัด (Compactness) ไม่ต้องมีที่ซ้ำซ้อนจำนวนมาก
  • ความเร็ว (Speed) เรียกใช้ข้อมูลได้รวดเร็วขึ้น
  • น่าเบื่อหน่ายลดลง (Less drudgery) ความยุ่งยากลดลง และความน่าเบื่อหน่ายลดลง
  • แพร่หลาย (Currency) มีข้อมูลที่ถูกต้องทันสมัยให้ใช้ตลอดเวลา ในวงกว้างขึ้น

ฐานข้อมูลเชิงสัมพันธ์(Relational Database)
เป็นรูปแบบของฐานข้อมูลที่นิยมใช้ในปัจจุบัน โดยถูกคิดค้นและพัฒนาโดย E.F. Codd เป็นรูปแบบที่เข้าใจง่ายสำหรับผู้ใช้ ไม่ซับซ้อนมีเครื่องมือที่ช่วยในการเรียกดูข้อมูล โดยใช้คำสั่งง่าย เช่น SQL
โมเดลนี้ใช้ relation หรือตาราง 2 มิติ แทน entity
ศัพท์ที่เกี่ยวข้อง
  • Relation = Table
  • Tuple = Row or Record
  • Attribute = Column or Field
  • Cardinality = Number of Rows
  • Primary = Unique Identifier
  • Domain = ขอบข่ายของค่าข้อมูล เช่น วันที่เริ่มทำงาน
ให้แต่ละ column ของตารางแทน attribute ให้แต่ละ row แทนค่าจริงของ 1 record (เรียก tuple)ฐานข้อมูลเชิงสัมพันธ์ เป็นการจัดเก็บรวบรวมข้อมูลเป็นแถวและคอลัมน์ในลักษณะตารางสองมิติ ที่ประกอบด้วย attribute ที่แสดงคุณสมบัติที่แสดงคุณสมบัติของ Relationship โดยผ่านกระบวนการทำให้เป็นบรรทัดฐาน (Normalized) ในระหว่างการออกแบบ เพื่อลดความซ้ำซ้อน และการจัดฐานข้อมูลอย่างมีประสิทธิภาพ
เป็นฐานข้อมูลซึ่งให้ภาพของข้อมูล ทั้งในระดับภายนอก(External Level) และ ระดับแนวคิด (Conceptual Level) แก่ผู้ใช้ฐานข้อมูลได้เป็นอย่างดี

คุณลักษณะในการจัดเก็บข้อมูล
ในแต่ละ Relation ประกอบด้วยข้อมูลของ Attribyte ต่างๆที่จัดเก็บในรูปตาราง 2 มิติ คือ Row, Column
  1. ข้อมูลในแต่ละแถวจะไม่ซ้ำกัน
  2. การจัดเรียงลำดับของข้อมูลในแต่ละแถวไม่เป็นสาระสำคัญ
  3. การจัดเรียงลำดับของ Attribute จะเรียงลำดับก่อนหลังอย่างไรก็ได้
  4. ค่าของข้อมูลในแต่ละ Attribute ของ Tuple หนึ่งๆ จะบรรจุได้เพียงค่าเดียว
  5. ค่าของข้อมูลในแต่ละ Attribute จะบรรจุค่าของข้อมูลประเภทเดียวกัน

กฎที่เกี่ยวข้องกับคีย์ในฐานข้อมูลเชิงสัมพันธ์
1. กฎความบูรณภาพของเอนทิตี้ (The Entity Intergrity Rule)
กฎนี้ระบุไว้ว่าแอททริบิวต์ใดที่เป็นคีย์หลัก ข้อมูลในแอททริบิวต์นั้นจะเป็นค่าว่าง(Null) ไม่ได้ ความหมายของการเป็นค่าว่างไม่ได้(Not Null) หมายความถึง ข้อมูลของแอททริบิวต์ที่เป็นคีย์หลักจะไม่ทราบค่าที่แน่นอนหรือไม่มีค่าไม่ได้
2. กฎความบูรณภาพของการอ้างอิง (The Referential IntegrityRule)
การอ้างอิงข้อมูลระหว่างรีเลชั่นในฐานข้อมูลเชิงสัมพันธ์จะใช้คีย์นอกของรีเลชั่นหนึ่งไปตรวจสอบกับค่าของแอททริบิวต์ที่เป็นคีย์หลักของอีกรีเลชั่นหนึ่งเพื่อเรียกดูข้อมูลอื่นๆที่เกี่ยวข้องหรือค่าของคีย์นอกจะต้องอ้างอิงให้ตรงกับค่าของคีย์หลักได้จึงจะสามารถเชื่อมโยงข้อมูลระหว่างสองรีเลชั่นได้สำหรับคีย์นอกจะมีค่าว่างได้หรือไม่ขึ้นอยู่กับกฎเกณฑ์การออกแบบฐานข้อมูล เช่น ในกรณีที่รีเลชั่นพนักงานมี Depnoเป็นคีย์นอกอาจจะถูกระบุว่าต้องทราบค่าแต่ในกรณีพนักงานทดลองงานอาจยังไม่มีค่า Depno เพราะยังไม่ได้ถูกบรรจุในกรณีที่มีการลบหรือแก้ใขข้อมูลของแอททริบิวต์ที่เป็นคีย์หลักซึ่งมีคีย์นอก จากอีกรีเลชั่นหนึ่งอ้างอิงถึง จะทำการลบหรือแก้ใขข้อมูลได้หรือไม่ ขึ้นอยู่กับการออกแบบฐานข้อมูล ว่าได้ระบุให้แอททริบิวต์มีคุณสมบัติอย่างไร ซึ่งมีโอกาสเป็นไปได้ 4 ทางเลือก
  1. การลบหรือแก้ใขข้อมูลแบบมีข้อจำกัด (Restrict) การลบหรือแก้ไขข้อมูลจะกระทำได้ เมื่อข้อมูลของคีย์หลักในรีเลชั่นหนึ่งไม่มีข้อมูลที่ถูกอ้างอิง โดยคีย์นอกของอีกรีเลชั่นหนึ่งเช่น รหัสแผนก Depno ในรีเลชั่นDepจะถูกแก้ใขหรือลบทิ้งต่อเมื่อไม่มีพนักงานคนใดสังกัดอยู่ในแผนกนั้น
  2. การลบหรือแก้ไขข้อมูลแบบต่อเรียง (Cascade) การลบหรือการแก้ใขข้อมูล จะทำแบบเป็นลูกโซ่ คือ หากมีการแก้ไขหรือลบข้อมูลของคีย์หลักในรีเลชั่นหนึ่งระบบจะทำการลบหรือแก้ใขข้อมูลของคีย์นอกในอีกรีเลชั่นหนึ่งที่อ้างอิงถึงข้อมูลของคีย์หลักที่ถูกลบให้ด้วย เช่น ในกรณีที่ยกเลิกแผนก 9 ในEntityแผนก ข้อมูลของพนักงานที่อยู่แผนก 10 ในEntityพนักงานจะถูกลบออกไปด้วย
  3. การลบหรือแก้ไขข้อมูลโดยเปลี่ยนเป็นค่าว่าง (Nullify) การลบหรือแก้ใขข้อมูลจะทำได้เมื่อมีการเปลี่ยนค่าของคีย์นอกในข้อมูลที่ถูกอ้างอิงให้เป็นค่าว่างเสียก่อน เช่น พนักงานที่อยู่ในแผนกที่ 9 จะถูกเปลี่ยนค่าเป็นค่าว่างก่อนหลังจากนั้น การลบข้อมูลของแผนกที่มีรหัส 9 จะถูกลบทิ้งหรือแก้ไขทันที ภายใน Entity แผนก
  4. การลบหรือแก้ไขข้อมูลแบบใช้ค่าโดยปริยาย ( Default) การลบหรือแก้ไขข้อมูลของคีย์หลัก สามารถทำได้โดยถ้าหากมีคีย์นอกที่อ้างอิงถึงคีย์หลักที่ถูกลบหรือแก้ไข ก็จะทำการปรับค่าของคีย์นอกนั้นโดยปริยาย (Default Value) ที่ถูกกำหนดขึ้นเช่น ในกรณีที่ยกเลิกแผนก 9 ในEntity แผนก ข้อมูลของพนักงานที่อยู่แผนก 9 ใน Entity พนักงานจะถูกเปลี่ยนค่าเป็น 00 ซึ่งเป็นค่าโดยปริยาย ที่หมายความว่า ไม่ได้สังกัดแผนกใด
 ประเภทของ Key
อง

1. Primary Key (คีย์หลัก)
เป็น Attribute ที่มีคุณสมบัติของข้อมูลที่เป็นค่าเอกลักษณ์หรือมีค่าที่ไม่ซ้ำกัน คุณสมบัติดังกล่าวจะสามารถระบุว่าข้อมูลนั้นเป็นข้อมูลของ Tuple ใด เช่น รหัสพนักงาน เลขที่ 3001 สามารถระบุได้ว่าเป็นของพนักงานชื่อ ดวงพร Attribute ที่มีคุณสมบัติเป็น คีย์หลักอาจประกอบด้วยหลาย Attribute รวมกันเรียกว่า Composite Key (คีย์ผสม)นอกจากนี้ ใน Relation หนึ่งๆ อาจมี Attribute ที่มีคุณสมบัติเป็นคีย์หลักได้มากกว่า หนึ่งAttribute เรียก Attribute เหล่านี้ว่า Candidate Key (คีย์คู่แข่ง)ถ้า Attribute หนึ่งถูกกำหนดให้เป็นคีย์หลัก อีก Attribute หนึ่งที่มีคุณสมบัติเป็นคีย์หลัก แต่ไม่ได้ถูกเลือกให้เป็นคีย์หลักจะเรียกว่า คีย์สำรอง (Alternate Key)
2. Foreign Key (คีย์นอก)
เป็น Attribute ใน Relation หนึ่งที่ใช้อ้างอิงถึง Attribute เดียวกันนี้ในอีก Relation หนึ่ง โดยที่ Attribute นี้มีคุณสมบัติเป็นคีย์หลักใน Relation ที่ถูกอ้างอิง การมี Attribute นี้ปรากฏอยู่ในRelation ทั้งสองก็เพื่อประโยชน์ ในการเชื่อมโยงข้อมูล

รูปแบบบรรทัดฐาน(Nomolization) 

แนวคิดในการทำรีเลชั่นให้อยู่ในรูปแบบบรรทัดฐานถูกคิดค้นโดย อี.เอฟ.คอดด์เป็นกระบวนการที่นำเค้าร่างของรีเลชั่นมาทำให้อยู่ในรูปแบบบรรทัดฐาน(normal from)
วัตถุประสงค์ของการทำให้เป็นบรรทัดฐาน มีดังนี้
  1. เพื่อลดเนื้อที่ในการเก็บข้อมูลการทำให้เป็นบรรทัดฐานเป็นการลดความซ้ำซ้อนของข้อมูลในรีเลชั่น
  2. เพื่อลดปัญหาที่ข้อมูลไม่ถูกต้อง(Inconsistency)เนื่องจากข้อมูลในรีเลชั่นหนึ่งจะมีข้อมูลไม่ซ้ำกัน เมื่อมีการปรับปรุงข้อมูลก็จะปรับปรุงทูเพิลนั้นๆครั้งเดียวไม่ต้องปรับปรุงหลายแห่ง
  3. เป็นการลดปัญหาที่เกิดจากการเพิ่ม ปรับปรุงและลบข้อมูล





รูปแบบบรรทัดฐาน (Normal Form)
รูปแบบบรรทัดฐานทีใช้ในการกำหนดแอททริบิวต์ที่เหมาะสม ในรีเลชั่นแบ่งออกเป็นดังนี
รูปแบบบรรทัดฐานขั้ยที่ 1
First Normal Form : 1NF
รีเลชั่นหนึ่งๆจะอยู่ในรูปแบบบรรทัดฐานขั้นที่ 1 ก็ต่อเมื่อ "ค่าของแอททริบิวต์หนึ่งในแต่ละทูเพิลจะมีค่าของข้อมูลเพียงค่าเดียวหากรีเลชั่นใดไม่มีคุณสมบัติดังกล่าวข้างต้นจะต้องทำการปรับปรุงให้อยู่ในรูปแบบบรรทัดฐานขั้นที่หนึ่งโดยการแยกกลุ่มข้อมูลที่ซ้ำกันเป็นรีเลชั่นใหม่และกำหนดให้เป็นแอททริบิวต์ที่เป็นตัวกำหนดค่าของกลุ่มข้อมูลที่ซ้ำกันนี้( Multivalued Attribute) เป็นคีย์หลักของรีเลชั่นใหม่"

Relation A
sno
sname
city
pno
qty
S1SeriBangkokP1 P2 P3 P4200 400 200 300
S2WandaRayongP1 P2400 300
S3SomhaiRayongP2200
S4
Orapan
Bangkok
P2
200
สมมุติให้รีเลชั่น A เป็นรีเลชั่นที่ประกอบด้วยAttribute ของ entity ผู้ผลิต และ entity การส่งของ โดยจะเห็นว่าในรีเลชั่น จะมีรหัสของผู้ผลิต s1,s2,s3,s4 และมีรหัสสินค้าหลายค่า วิธีแก้ไขปัญหานี้คือ การไส่ข้อมูลของ s1,s2,s3,s4 ลงไปในทุก รหัสสินค้า โดยผลการใส่ข้อมูลดังกล่าวนี้จะทำให้รหัสผู้ผลิต (sno) ไม่ใช่คีย์หลัก แต่คีย์หลักจะประกอบด้วยรหัสผู้ผลิตและ รหัสสินค้า (sno,pno)
Relation A
snosnamecitypnoqty
S1SeriBangkokP1300
S1SeriBangkokP2200
S1SeriBangkokP3400
S1SeriBangkokP4200
S2WandaRayongP1300
S2WandaRayongP2400
S3SomchaiRayongP2200
S4OrapanBangkokP2200
อย่างไรก็ตาม อาจมีความผิดพลาดบางอย่างที่อาจเกิดขึ้นกับข้อมูลนี้อยู่ เช่น
  1. ความผิดพลาดที่เกิดจากการเพิ่มข้อมูล (Insert Anomaly) จากรีเลชั่นนี้ จะเห็นว่าการที่เพิ่มข้อมูลของผู้ผลิตจะทำได้ต่อเมื่อผู้ผลิตรายนั้นได้มีการส่งสินค้าไปให้ผู้ซื้อรีเลชั่น แต่จะไม่ แสดงรายละเอียดของสินค้าของสินค้าผู้ผลิต s5 ที่อยู่ จ. เลย ถ้าไม่มีการส่งสินค้า ปัญหาคือ การกำหนด attribute ที่เป็นคีย์หลักของรีเลชั่นนี้ เป็นการกำหนดที่ไม่เหมาะสม จากกฏความบูรณภาพของเอนทิตี้ (The Entity Integrity Rule)โดยที่รหัสสินค้า(pno)จะเป็นค่าว่าง หากมีเพียงข้อมูลของผู้ผลิตแต่ไม่เคยสั่งสินค้า
  2. ความผิดพลาดที่เกิดจากการลบข้อมูล (Delete Anomaly) ในการลบข้อมูลบางทูเพิลทิ้งไปจะลบทั้งข้อมูลผู้ผลิตและข้อมูล การส่งสินค้า เช่นการลบข้อมูลทูเพิลรหัสผู้ผลิต s3 และรหัสสินค้า p2 จะทำให้ข้อมูลของผู้ผลิต s3 หายจากฐานข้อมูล ปัญหาของรีเลชั่นนี้คือ รีเลชั่นนี้ประกอบด้วย attribute ที่เกินเงื่อนไขในการใช้งาน ( มี attribute มากเกินไปโดยที่ข้อมูลของบาง attribute อาจไม่จำเป็นใช้งานแต่มาผูกติดกับ attrbute ที่ต้องการใช้งาน )
  3. ความผิดพลาดที่เกิดจากการปรับปรุงข้อมูล(Update Anomaly) การปรับปรุงข้อมูลของรีเลชั่น จะทำให้เกิดความความยุ่งยากและเสียเวลา  รวมถึงอาจก่อให้เกิดความผิดพลาดที่ข้อมูลไม่เหมือนกัน เช่น การปรับปรุงข้อมูลใน s1 โดยเปลื่ยนชื่อจังหวัดจาก Bangkok เป็น Ayudtaya ซึ่งการปรับเปลื่ยนข้อมูลนี้ จะต้องค้นหารหัสผู้ผลิต s1 ทุกทูเพิลมาปรับปรุง ทำให้เสียเวลาและอาจเกิดความผิดพลาดที่ผู้ผลิตรหัส S1 บางทูเพิลไม่ได้ถูกเปลื่ยนเป็นชื่อจังหวัดใหม่ปัญหาที่เกิดขึ้นของรีเลชั่น สามารถแก้ไขโดยการแตกรีเลชั่น(Decomposition) ออกเป็น 2 รีเลชั่น คือ  Supplier,OrderSupplier ประกอบด้วย Attribute Sno,Sname,City โดยมี Attribute Sno เป็น Primary keyOrder ประกอบด้วย Attribute Sno,Pno,City โดยมี
  4.  Attribute SnoและPno  เป็น Primary key ร่วมกัน
รูปแบบบรรทัดฐานขั้นที่ 2 
Second Normal Form : 2NF
รีเลชั่นหนึ่งๆ จะอยู่ในรูปแบบบรรทัดฐานขั้นที่ 2 ก็ต่อเมื่อ "รีเลชั่นนั้นๆอยู่ในรูปแบบบรรทัดฐานขั้นที่ 1 และมีคุณสมบัติอีกประการหนึ่งคือแอทริบิวต์ทุกแอททริบิวต์ที่ไม่ได้เป็นคีย์หลักจะต้องมีความสัมพันธ์ระหว่างค่าของแอทริบิวต์แบบฟังก์ชั่นกับคีย์หลัก(Fully Functional Dependency) กล่าวอีกนัยหนึ่งคือค่าของแอททริบิวต์ที่ไม่ได้เป็นคีย์หลักจะสามารถระบุค่า โดยแอททริบิวต์ที่เป็นคีย์หลัก แอททริบิวต์ทั้งหมดที่ประกอบกันเป็นคีย์หลัก" ในกรณีที่คีย์หลักเป็นคีย์ผสม จากรีเลชั่น Supplier และ Order รีเลชั่นทั้งสองอยู่ในรูปแบบบรรทัดฐานขั้นที่ 2 แล้ว ในรีเลชั่น Supplier มีรหัสผู้ผลิตเป็นคีย์หลัก เช่น เมื่อทราบค่า รหัสผู้ผลิต S1 ก็จะสามารถทราบค่าของชื่อและจังหวัดของผู้ผลิตคือ Seri อยู่ที่จังหวัด Bangkok หรือในรีเลชั่น Order  จำนวนการส่งสินค้า (QTY) จะถูกระบุโดยรหัสผู้ผลิตและรหัสสินค้า ดังนั้น ค่าของแอททริบิวต์อื่นๆที่ไม่ได้เป็นคีย์หลักของรีเลชั่น Supplier และ Order สามารถระบุโดยค่าของแอททริบิวต์ที่เป็นคีย์หลัก
รูปแบบบรรทัดฐานขั้นที่ 3
Third Normal Form :3NF
รีเลชั่นหนึ่งๆจะอยู่ในรูปแบบบรรทัดฐานขั้นที่ 3 (3NF)  ก็ต่อเมื่อ“รีเลชั่นนั้นๆอยู่ในรูปแบบบรรทัดฐานขั้นที่ 2 ละมีคุณสมบัติอีกประการหนึ่งคือแอททริบิวต์ที่ไม่ได้เป็นคีย์หลักไม่มีคุณสมบัติในการกำหนดค่าของแอททริบิวต์อื่นที่ไม่ใช่คีย์หลัก” จากรูปรีเลชั่น Supplier 1 จะคล้ายคลึงกับรีเลชั่น Supplier ที่เคยกล่าวมาข้างต้นเพียงแต่เพิ่มแอททริบิวต์ Rating เข้าไปรีเลชั่นนี้มีรหัสผู้ผลิตเป็นคีย์หลัก  
SNAMESUPPLIER 1 
SNO
SNAME
CITY 
RATING
S1
SERI 
BANGKOK 
2
S2
WANIDA
RAYONG
3
S3
SOMCHAI
RAYONG 
3
S4
ORAPIN
BANGKOK
2
S5
TANACHOTE 
PATUMTANE
1
หากพิจารณาดูแล้วจะเห็นว่ารีเลชั่น Supplier 1 นี้ อยู่ในรูปแบบบรรทัดฐานขั้นที่ 2 แล้ว คือ ไม่มีค่าของข้อมูลซ้ำกันและขณะเดียวกัน ค่าของแอททริบิวต์ที่ไม่ได้เป็นคีย์หลักอื่นๆสามารถระบุค่าได้โดยค่าของแอททริบิวต์ที่เป็นคีย์หลัก เช่นถ้าทราบว่ารหัสผู้ผลิตคือ SI จะสามารถทราบเลยว่า ผู้ผลิตนั้นๆชื่ออะไร อยู่ที่จังหวัดใดและอยู่ในจังหวัดที่ถูกจัดอันดับไว้เป็นอันดับเท่าไร รีเลชั่นนี้ไม่มีคีย์คู่แข่ง เพราะว่าไม่มีคีย์อื่นที่มีคุณสมบัติเป็นคีย์หลักได้เช่นเดียวกับรหัสผู้ผลิต ถึงแม้ว่าชื่อจังหวัดสามารถจะระบุการจัดอันดับของผู้ผลิต แต่ไม่สามารถระบุชื่อของผู้ผลิตได้ชัดเจนเช่นในกรณีของชื่อจังหวัดที่อยู่กรุงเทพชื่อของผู้ผลิตอาจเป็นSeri หรือ Orapin ก็ได้ ซึ่งไม่สามารถกำหนดชัดเจนว่าชื่ออะไร แอททริบิวต์ City จึงไม่มีคุณสมบัติเป็นคีย์หลักหรือคีย์คู่แข่งนอกจากนี้จะพบว่ามีความสัมพันธ์ระหว่างแอททริบิวต์ที่ไม่ได้เป็นคีย์หลักอยู่ นั่นคือ แอททริบิวต์ชื่อจังหวัด (City) และแอททริบิวต์การจัดอันดับของผู้ผลิต(Rating ) โดยแอททริบิวต์ชื่อจังหวัดสามารถระบุค่าการจัดอันดับความสะดวกในการขนส่งสินค้า ซึ่งเป็นความสัมพันธ์ระหว่างค่าของแอททริบิวต์แบบทรานซิทีฟ (TransitiveDependency)หากรีเลชั่นใดมีคุณสมบัติดังกล่าว จะก่อให้เกิดความผิดพลาดที่เกิดจากการเพิ่ม หรือลบหรือปรับปรุงข้อมูลได้ เช่นก. ความผิดพลาดที่เกิดจากการปรับปรุงข้อมูล (Update Anomaly) หากมีการแก้ไขการจัดอันดับของจังหวัดของจังหวัดของผู้ผลิตเนื่องจากความสะดวกในการขนส่งที่เปลี่ยนแปลงไป จะต้องทำการแก้ไขข้อมูลหลายทูเพิล ซึ่งอาจจะเกิดปัญหาการแก้ไขไม่ครบถ้วน อันจะก่อให้เกิดความไม่ตรงกันของข้อมูลได้ข. ความผิดพลาดที่เกิดจากการลบข้อมูล (Delete Anomaly)หากมีการลบข้อมูลการจัดอันดับของจังหวัดของผู้ผลิต จะทำให้ข้อมูลการจัดอันดับของจังหวัดนั้นหายไปจากฐานข้อมูลเช่น หากลบทูเพิลของรหัสผู้ผลิต S5 จะไม่มีข้อมูลของผู้ผลิตที่อยู่ที่จังหวัดปทุมธานีว่าถูกจัดอันดับอยู่ที่อันดับที่เท่าไร ด้วยเหตุผลที่แอททริบิวต์ชื่อจังหวัดไม่มีคุณสมบัติเป็นคีย์หลักในรีเลชั่น Supplier 1 แต่สามารถกำหนดค่าของแอททริบิวต์การจัดอันดับได้ ซึ่งอาจก่อให้เกิดปัญหาความผิดพลาดจากการเพิ่ม ปรับปรุงหรือลบข้อมูลการขจัดปัญหาดังกล่าวจะทำได้โดยการ แตกรีเลชั่น Supplier1เป็นสองรีเลชั่น (Decomposition) โดยแยกแอททริบิวต์ที่ถูกกำหนดค่ากับแอททริบิวต์ที่เป็นตัวกำหนดค่า(Determinant)ออกเป็นรีเลชั่นใหม่ และกำหนดให้แอททริบิวต์ที่เป็นตัวกำหนดค่า (Determinant) เป็นคีย์หลักของรีเลชั่นใหม่ดังนี้ SUPPLIER (SNO,SNAME,CITY) CITY(CITY,RATING)รีเลชั่น Supplier ประกอบด้วยแอททริบิวต์ (SNO,SNAME,CITY) มี SNO เป็นคีย์หลักโดยมี CITY เป็นคีย์นอกที่อ้างอิงถึงแอททริบิวต์ CITY  ที่อยู่ในรีเลชั่น CITY ประกอบด้วยแอททริบิวต์(City,Rating) และมี City เป็นคีย์หลัก วิธีการแตกรีเลชั่น(Decomposition) ที่กล่าวมาข้างต้นจะต้องทำตามขั้นตอนดังนี้คือ ประการแรก ให้นำแอททริบิวต์ทึ่ถูกกำหนดค่ากับแอททริบิวต์ที่เป็นตัว กำหนดค่าแยกออกเป็นรีเลชั่นใหม่และ ประการที่สองคือกำหนดให้แอททริบิวต์ที่เป็นตัวกำหนดค่าเป็นคีย์หลักของรีเลชั่นใหม่นั้นอย่างไรก็ตามในบางครั้งผู้ออกแบบเค้าร่างของฐานข้อมูลพยายามแตกรีเลชั่นที่มีแอททริบิวต์มากๆออกเป็นหลายรีเลชั่นโดยไม่ได้ปฎิบัติตามวิธีการที่กล่าวมาแล้วข้างต้นซึ่งจะทำให้เกิดปัญหาการแตกฐานข้อมูลที่ไม่เหมาะสมได้(Bad Decomposition) ตัวอย่างเช่น หากแตกรีเลชั่นของ Supplier 1 เป็นดังนี้  รีเลชั่น Supplier (SNO SNAME CITY) มีSNO เป็นคีย์หลัก รีเลชั่น Supplier 2 (SNO,RATING) มี SNOเป็นคีย์หลัก
SUPPLIER
SNO
SNAME
  CITY
S1SERI BANGKOK
S2WANIDARAYONG
S3SOMCHAIRAYONG
S4ORAPIN BANGKOK
S5TANACHOTE PATUMTANE

SUPPLIER2 
SNO
SNAME
S1
 2
S2
3
S3
3
S4
2
S5
 1
จากรูป การแตกรีเลชั่นจากตัวอย่างนี้ดูเหมือนจะแก้ปัญหาความผิดพลาดที่อาจจะเกิดขึ้นจากการเพิ่ม ลบ หรือปรับปรุงข้อมูลได้ เพราะได้แตกรีเลชั่นออกเป็นสองรีเลชั่น และอยู่ในรูปแบบบรรทัดฐานขั้นที่ 3 แล้ว แต่การแตกรีเลชั่นทั้งสองข้อที่จะก่อให้เกิดความผิดพลาดขึ้นได้อีกเช่นกัน จากตัวอย่างนี้จะเห็นว่าการเพิ่มชื่อจังหวัดและการจัดอันดับของจังหวัดใหม่จะทำไม่ได้จนกว่าจะมีผู้ผลิตรายใดอยู่ที่จังหวัดที่จะเพิ่มชื่อและจัดอันดับนั้นรีเลชั่น Supplier และรีเลชั่น Supplier 2 เป็นรีเลชั่นที่ไม่มีความเป็นอิสระจากกัน ทั้งนี้เพราะจังหวัดเป็นตัวกำหนดการจัดอันดับ


รูปแบบบรรทัดฐานของบอยส์และคอดด์
(Boyce/Codd Normal Form : BCNF )

รีเลชั่นหนึ่งๆ จะอยู่ในรูปแบบบรรทัดฐานของบอยส์และคอดด์ก็ต่อเมื่อ "รีเลชั่นนั้นๆ อยู่ในรูปแบบบรรทัดฐานขั้นที่ 3 และไม่มีแอททริบิวต์อื่นในรีเลชั่นที่สามารถระบุค่าของแอททริบิวต์ที่เป็นคีย์หลัก หรือ ส่วนหนึ่งส่วนใดของคีย์หลักในกรณีที่คีย์หลักเป็นคีย์ผสม" โดยทั่วไปรูปแบบบรรทัดฐานของบอยส์และคอดด์จะอยู่ในรูปแบบ บรรทัดฐานขั้นที่ 3 แต่ไม่จำเป็นเสมอไปว่ารูปแบบบรรทัดฐานขั้นที่3 จะอยู่ในรูปแบบของ BCNF ทั้งนี้เนื่องจากรูปแบบนี้เป็นรูปแบบที่ขยายขอบเขตของรูปแบบบรรทัดฐานขั้นที่ 3 ให้เหมาะสมยิ่งขึ้น โดยรูปแบบของรีเลชั่นที่มีโอกาสที่จะต้องผ่านการทำให้เป็นบรรทัดฐาน BCNF   มักจะมีคุณสมบัติดังนี้ คือ “เป็นรีเลชั่นที่มีคีย์คู่แข่งหลายคีย์ (Multiple Candidate Key) คีย์คู่แข่งเป็นคีย์ผสม (Composite Key) และคีย์คู่แข่งนั้นมีความซ้ำซ้อนกัน (Overlapped) ” เพื่อให้ง่ายต่อการอธิบาย จะใช้รีเลชั่น Supplier 3 เป็นตัวอย่าง ในการอธิบายโดยสมมุติว่าชื่อของผู้ผลิต ( SNAME) เป็นค่าไม่ซ้ำกัน และมีคุณสมบัติเป็นคีย์หลักได้เช่นกัน ดังรูป  
SUPPLIER3
Sno
         Sname
PnoQty
S1SERIP1300
S1SERIP2200
S1SERIP3400
S1SERIP4200
S1SERIP5100
S1SERIP6100
S2WANIDAP1300
S2WANIDAP2400
S3SOMCHAI P2200
S4ORAPINP2200
S4 ORAPINP4300
S4ORAPINP5400
จากรูป เป็นรีเลชั่นที่มีปัญหาเพราะมีคีย์คู่แข่งเป็นคีย์ผสม และมีความซ้ำซ้อนกัน คีย์คู่แข่งที่มีคุณสมบัติเป็นคีย์หลักของรีเลชั่น  อาจจะเป็นแอททริบิวต์รหัสผู้ผลิตและรหัสสินค้า (SNO และ PNO) หรือแอททริบิวต์ชื่อผู้ผลิตและรหัสสินค้า (SNAME และ PNO) รีเลชั่นนี้ไม่ได้อยู่ในรูปแบบบรรทัดฐาน BCNF เพราะเมื่อเลือกคีย์คู่แข่งใดเป็นคีย์หลักแล้ว คีย์คู่แข่งที่ไม่ได้ถูกเลือก จะยังปรากฎซ้ำซ้อนอยู่ในรีเลชั่นนี้ และมีคุณสมบัติในการระบุค่าของแอททริบิวต์ที่เป็นคีย์หลัก ตัวอย่างเช่น หากเลือกแอททริบิวต์ SNO และ PNO เป็นคีย์หลักแล้ว จะเกิดปัญหาในรีเลชั่นนี้คือ  แอททริบิวต์ SNAME จะมีคุณสมบัติในการระบุค่าของแอททริบิวต์ SNO ดังนี้
 
นอกจากนี้ รีเลชั่นนี้ยังเป็นรีเลชั่นที่ประกอบด้วยข้อมูลที่ซ้ำซ้อนกันอันจะก่อให้เกิดความผิดพลาดที่เกิดจากการเพิ่ม แก้ไขหรือปรับปรุงข้อมูล เช่น การเปลื่ยนชื่อของผู้ผลิต S1 จะต้องแก้ไขหลายทูเพิล ซึ่งอาจเกิดความผิดพลาดที่แก้ไขข้อมูลไม่ครบถ้วนได้ ดังนั้น รีเลชั่นSupplier3จึงต้องทำการแตกรีเลชั่นออกโดยแยกแอททริบิวต์ที่สามารถระบุค่าของคีย์คู่แข่งแยกเป็นอีกรีเลชั่นหนึ่งซึ่งอาจทำได้สองกรณี คือกรณีที่ 1 Supplier 4 (Sno,Sname)มี Sno และ Sname เป็นคีย์หลัก  Order 2 (Sno,Pno,Qty)  มี Sno และ Pno เป็นคีย์หลักหรือ กรณีที่ 2 Supplier 4 (Sno,Sname)  มี Sno และ Sname เป็นคีย์หลัก  Order 2 (Sname,Pno,Qty)  มี Sname และ Pno เป็นคีย์หลักกล่าวโดยสรุปรูปแบบ BCNF เป็นรูปแบบที่ขยายขอบเขตของรูปแบบบรรทัดฐานขั้นที่ 3 โดยมีการตรวจสอบรีเลชั่นว่ามีแอททริบิวต์อื่นที่ไม่ใช่คีย์หลัก แต่สามารถระบุค่าของคีย์หลักได้  



รูปแบบบรรทัดฐานขั้นที่ 4
(Fourth Normal Form : 4NF)

รีเลชั่นนี้จะอยู่ในรูปแบบบรรทัดฐานขั้นที่ 4 ก็ต่อเมื่อ "รีเลชั่นนั้นๆ อยู่ในรูปแบบ BCNF และเป็นรีเลชั่นที่ไม่มีความสัมพันธ์ในการระบุค่าของแอททริบิวต์แบบหลายค่า"  โดยที่ แอททริบิวต์ที่ถูกระบุค่าหลายค่าเหล่านี้ไม่มีความสัมพันธ์กัน (Independently Multivalued Dependency) รีเลชั่นที่ต้องผ่านการทำให้อยู่ในรูปแบบบรรทัดฐานขั้นที่4นี้จะต้องมีแอททริบิวต์อย่างน้อยสามแอททริบิวต์ จากรูป เป็นรีเลชั่นที่ประกอบด้วยแอททริบิวต์รหัสผู้ผลิต (Sno) รหัสโครงการที่สั่งผลิต (Pjno) และชื่อจัหวัดที่โรงงานของผู้ผลิต ตั้งอยู่  (City) โดยกำหนดให้ผู้ผลิตหนึ่งผลิตให้หลายโครงการ และผู้ผลิตหนึ่งๆ มีโรงงานตั้งอยู่ที่หลายจังหวัด (City)
Sno
Pjno
City
S1Pj01 Pj02Bangkok Samuthprakarn
S2Pj03 Pj04  Pj05Rayong Chonbure
ทำให้อยู่ในรูปแบบบรรทัดฐาน BCNF โดยให้ทุกแอททริบิวต์ประกอบกันเป็นคีย์หลัก
SPJC 
  Sno
Pjno
City
S1
Pj01
Bangkok
S1
Pj01
Samuthprakarn
S1
Pj02
Bangkok
S1
Pj02
Samuthprakarn
S2
Pj03
Rayong
S2
Pj05
Chonbure
S2
Pj04
Rayong
S2
Pj04
Chonbure
S2
Pj05
Rayong
S2
Pj05
Chonbure
รีเลชั่น SPJC ประกอบด้วยแอททริบิวต์รหัสผู้ผลิต (Sno) ซึ่งมีความ สัมพันธ์ ในการระบุค่าแอททริบิวต์รหัสโครงการที่สั่งผลิต(Pjno) และแอททริบิวต์จังหวัดที่โรงงานของผู้ผลิตตั้งอยู่ (City) ได้หลายค่า รีเลชั่น SPJC อยู่ในรูปแบบ BCNF เมื่อมีแอททริบิวต์ทุกแอททริบิวต์ เป็นคีย์ นอกจากนี้ รหัสผู้ผลิต (SNO) มีความสัมพันธ์ในการระบุค่า ของรหัสโครงการที่สั่งผลิต (PJNO) แบบหลายค่า (SNO->-> PJNO) ในขณะเดียวกัน รหัสผู้ผลิต (SNO) ก็มีความสัมพันธ์ในการระบุค่า แบบหลายค่ากับชื่อจังหวัดที่ผู้ผลิตตั้งอยู่ (CITY) การที่แอททริบิวต์ ทั้งสองไม่มีความสัมพันธ์กันแต่มาอยู่ในรีเลชั่นเดียวกัน  จะก่อให้เกิด ความซ้ำซ้อนของข้อมูลเกิดขึ้น เพราะค่าของชื่อจังหวัดจะต้องปรากฏ ในรีเลชั่นซ้ำกันเพื่อให้ข้อมูลในแต่ละทูเพิลมีข้อมูลครบถ้วนถึงแม้ว่ารีเลชั่น SPJC จะอยู่ในรูปแบบของBCNFโดยมีแอททริบิวต์ทุกแอททริบิวต์ประกอบกันเป็นคีย์หลักก็ตาม  รีเลชั่นนี้ก็ยังมีปัญหาแฝงอยู่เช่นกัน  ปัญหาความผิดพลาดที่เกิดจากการเพิ่ม ลบ หรือปรับปรุงข้อมูล มีโอกาสที่เกิดขึ้นมากมาย เช่น หากผู้ผลิตรหัส S2 ย้ายโรงงานRAYONG ไปอยู่จังหวัดอื่น ก็ต้องทำการแก้ไขข้อมูลหลายทูเพิล หรือความผิดพลาดในการเพิ่มข้อมูล อาจทำไม่ได้เช่นการเก็บข้อมูลที่จังหวัด ที่ตั้งของผู้ผลิตคนใหม่  ที่ยังไม่เคยได้รับงานโครงการใด ก็จะทำไม่ได้ เป็นต้น  สามารถแก้ปัญหารีเลชั่น โดยแบ่งออกเป็น 2 รีเลชั่นคือ  รีเลชั่น SPJ ประกอบด้วย แอททริบิวต์ SNO และ PJNO และมีแอททริบิวต์ทั้งสอง ประกอบกันเป็นคีย์หลักดังนี้
SPJ 
SNO
PJNO
S1
PJ01
S1
PJ02
S2
PJ03
S2
PJ04
S2
PJ05
รีเลชั่น SC ประกอบด้วยแอททริบิวต์ SNO และ CITY และมีแอททริบิวต์ทั้งสองประกอบกันเป็นคีย์หลัก  ดังนี้

SC 
SNO
CITY
S1
BANGKOK
S1
SAMUTHPRAKARN
S2
RAYONG
S2
CHONBURI





รูปแบบบรรทัดฐานขั้นที่ 5
(Firfth Normal Form : 5NF )
รีเลชั่นหนึ่ง ๆ จะอยู่ในรูปแบบบรรทัดฐานขึ้นที่ 5 หรือเรียกว่า Project-JoinNormal Form (PJ/NF) ก็ต่อเมื่อ "รีเลชั่นนั้นอยู่ในรูปแบบบรรทัดฐานขึ้นที่ 4 และเป็นรีเลชั่นที่มีคีย์หลักเป็นคีย์ผสมที่ประกอบด้วยแอททริบิวต์ตั้งแต่ 3 แอททริบิวต์เป็นต้นไป  หากมีการแตกรีเลชั่นออกเป็นรีเลชั่นย่อย 3 รีเลชั่น (หรือมากกว่า) (Projection) ซึ่งเกิดจากการจับคู่แอททริบิวต์แต่ละคู่ของรีเลชั่น  เดิมเป็นคีย์ผสมและเมื่อทำการเชื่อมโยงรีเลชั่นย่อยทั้งหมด (Join) จะไม่ก่อให้เกิดข้อมูลใหม่ที่ไม่เหมือนรีเลชั่นเดิม" จากรูป รีเลชั่น SPP ประกอบด้วยแอททริบิวต์ชื่อผู้ผลิต (SNAME)  ชื่อสินค้า (PNAME) และชื่อโครงการ (PJNAME)โดยมีแอททริบิวต์ทั้ง 3 เป็นคีย์หลัก
 RELATION SPP
SNAMEPNAMEPJNAME
SERI 
PEN
PROJ2
SERI
TABLE
PROJ1
WANIDA
PEN
PROJ1
SERI
PEN
PROJ1
รีเลชั่น SPP จะอยู่ในรูปแบบบรรทัดฐานขั้นที่ 4 แต่ก็ประสบปัญหาในการปรับปรุงแก้ไขข้อมูล เช่น การลบข้อมูล ของทูเพิลที่ 3 ข้อมูลของชื่อผู้ผลิต ชื่อ WANIDA ก็จะหายไปจากฐานข้อมูลหรือหากมีการเปลี่ยนชื่อสินค้าใด สินค้าหนึ่ง ก็จะต้องทำการปรับปรุงหลายทูเพิล
เพื่อหลีกเลี่ยงปัญหาดังกล่าว จึงทำการแตกรีเลชั่น SPP เป็น 3 รีเลชั่นย่อย (Projection) โดยในแต่ละรีเลชั่นย่อย  จะประกอบด้วยแอททริบิวต์แต่ละคู่เป็นคีย์ผสมของรีเลชั่นย่อย ดังรูป
รีเลชั่น 1 : SP
SNAME PNAME
 SERIPEN
 SERITABLE
WANIDAPEN

รีเลชั่น 2 : PPJ 
PNAMEPJNAME
PENPROJ2
TABLEPROJ1
PENPROJ1
  
รีเลชั่น 3 : PJS
PJNAME      SNAME
PROJ2SERI
PROJ1SERI
PROJ1WANIDA

รีเลชั่น SPP
SNAMEPNAMEPJNAME
SERIPENPROJ2
SERITABLEPROJ1
WANIDAPENPROJ1
SERIPENPROJ1

เมื่อแตกรีเลชั่น SPP ออกเป็นรีเลชั่น SP และ PPJ และ PJS แล้ว  หากนำ ทั้ง 3 รีเลชั่นมาเชื่อมโยงกันจะมีข้อมูลเหมือนในรีเลชั่น SPP  ดังนั้นเมื่อ มีการแตกรีเลชั่นออกมา  และมีการเชื่อมโยงรีเลชั่นย่อยนั้นใหม่   หาก ไม่มีข้อมูลที่แตกต่างไปจากรีเลชั่นเดิม  ก็จะสามารถแตกรีเลชั่นนั้นได้ แต่ถ้าหากแตกเป็นรีเลชั่นย่อยแล้วเกิดข้อมูลไม่เหมือนกับรีเลชั่นเดิมก็ให้ ถือว่ารีเลชั่นเดิมนั้นอยู่ในรูปแบบบรรทัดฐานที่ 5 แล้ว  จากตัวอย่าง รีเลชั่น SCPJ เป็นรีเลชั่นที่อยู่ในรูปแบบบรรทัดฐานขั้นที่ 4   โดยมี แอททริบิวต์รหัสผู้ผลิต (SNO)  ชื่อจังหวัดของผู้ผลิต (CITY)  และรหัส โครงการ (PJNO) ประกอบเป็นคีย์หลัก  รีเลชั่นนี้ก็ยังมีปัญหาที่อาจเกิด ความผิดพลาดในการเพิ่มปรับปรุงหรือลบข้อมูลจึงทำการแตก  รีเลชั่น SCPJ ออกเป็นรีเลชั่น SC  CPJ  PJS  แต่ก็เกิดปัญหาเมื่อนำทั้ง 3 รีเลชั่นมาเชื่อมโยงกัน  ก็จะมีข้อมูลเกินมาคือ S1 RAYONG PJ01 ซึ่งไม่มีในรีเลชั่นเดิม
RELATION SCPJ
SNO
CITY 
PJNO
S1BANGKOKPJ01
S1RAYONGPJ02
S3RAYONGPJ01


RELATION SC
SNAME
PNAME
SERIPEN
SERITABLE
WANIDAPEN

PENRELATION CPJ
PNAME PJNAME
PENPROJ2
TABLEPROJ1
PENPROJ1



RELATION PJS
PJNAME
SNAME
PROJ2 
SERI
PROJ1
SERI
PROJ1 
WANIDA

SNAMEPNAMEPJNAME
SERIPENPROJ2
SERITABLEPROJ1
WANIDAPENPROJ1
SERIPENPROJ1


d
้ะพ


การออกแบบและพัฒนาฐานข้อมูล
ลักษณะของการออกแบบฐานข้อมูลโดยใช้โปรแกร
Microsoft Access 97
โปรแกรม Microsoft Access 97เป็นหนึ่งในชุดโปรแกรมสำเร็จรูป Microsoft Office 97 ซึ่งโปรแกรม Microsoft Access 97 จะเป็นโปรแกรมสำหรับจัดการงานทางด้านฐานข้อมูลโดยเฉพาะ มีความทันสมัย และสามารถสร้างและจัดการฐานข้อมูลได้อย่างสะดวก รวดเร็วและง่ายดาย อีกทั้งถ้าหากเป็นชุด Office 97 ภาษาไทย ก็จะสนับสนุนการใช้ภาษาไทย รวมทั้งระบบความช่วยเหลือก็เป็นภาษาไทยด้วย

ในทุกๆ ฐานข้อมูลของ Microsoft Access 97 จะประกอบไปด้วยตารางข้อมูลย่อยๆ ที่สามารถแบ่งเป็นประเภทตามความต้องการของผู้ออกแบบและพัฒนาฐานข้อมูลได้


การออกแบบฐานข้อมูลย่อยของMicrosoft Access 97 ซึ่งในแต่ละฟิลด์ (Field หรือเขตข้อมูลหนึ่งๆ) สามารถกำหนดประเภทของข้อมูลได้หลายประเภท (ซึ่งสนับสนุนทั้งในตัวโปรแกรมเองและโปรแกรมอื่นๆ ด้วย)


การกำหนด Primary Key เพื่อการอ้างอิงใน Microsoft Access 97
 

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


ข้อมูลเมื่อถูกนำเข้าครบทุกฟิลด์ (เขตข้อมูล) แล้วก็จะถือว่ากลายเป็นหนึ่งเรคอร์ด (Record หรือ ระเบียน)

ki








า่้ิืทา่มู

ไม่มีความคิดเห็น:

แสดงความคิดเห็น