1. สถาปัตยกรรมฐานข้อมูล(Database architecture) 3 ระดับ(Three-level architecture) ::
- 1.1 ระดับภายนอก (External level)
- มาจากแบบฟอร์มเอกสาร ว่ามีอะไรในเอกสารบ้าง หรือจากผู้ใช้ที่แต่ละคน
- เป็นการรวบรวมข้อมูลอย่างง่าย ๆ จากผู้ใช้ เพื่อให้กับนักวิเคราะห์นำไปศึกษา
- ผู้ใช้คนที่หนึ่ง : (รหัส, ชื่อ)
- ผู้ใช้คนที่สอง : (รหัส, ที่อยู่)
- 1.2 ระดับความคิด (Conceptual level)
- ตีความออกมาเป็นตารางโดยนำแบบฟอร์มต่าง ๆ มารวมกัน เพื่อแสดงความต้องการของผู้ใช้ในรูปที่สมบูรณ์
- อาจมีการวิเคราะห์ และออกแบบโดยผ่านขั้นตอนมากมาย ทั้ง E-R หรือ Normalization จนเสร็จสิ้น
- พนักงาน (รหัส, ชื่อ, ที่อยู่) ในแบบสคีมา(Schema)
- หรือ
- person (id, name, address) ในแบบสคีมา(Schema)
- 1.3 ระดับภายใน (Internal level)
- ตีความในระดับการจัดเก็บข้อมูลจริง เป็นหน้าที่ของผู้ออกแบบอย่างแท้จริง
- struct person{
- int id;
- char name[20];
- char address[20]
- } index id;
ตัวอย่างของ Relation schema ของ Northwind
- Categories (CategoryID,CategoryName,Description,Picture)
- Customers (CustomerID,CompanyName,ContactName,ContactTitle,Address,City,Region,PostalCode,Country,Phone,Fax)
- Employees (EmployeeID,LastName,FirstName,Title,BirthDate,HireDate,Address,City,Region,PostalCode,Country,HomePhone,Extension,Photo,Notes,ReportsTo)
- Products (ProductID,ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued)
- Shippers (ShipperID,CompanyName,Phone)
- Suppliers (SupplierID,CompanyName,ContactName,ContactTitle,Address,City,Region,PostalCode,Country,Phone,Fax,Homepage)
- Orders (OrderID,CustomerID,EmployeeID,OrderDate,RequiredDate,ShippedDate,ShipVia,Freight,ShipName,ShipAddress,ShipCity,ShipRegion,ShipPostalCode,ShipCountry)
- Order Details (OrderID,ProductID,UnitPrice,Quantity,Discount)
ตารางข้างล่างนี้คือ ตารางแสดงความสัมพันธ์ที่ใช้โปรแกรม Microsoft access สร้างขึ้น
|
5. ขั้นตอนการ Normalization
5.1 เปลี่ยนตารางที่ยังไม่เคย Normalization เป็น First Normal Form หรือ 1NF
- วิธีพิจารณา คือ แยกข้อมูลเป็นระเบียน โดยไม่มีการจัดกลุ่ม
ตารางที่ไม่ผ่านการ normalization
orderid 305 |
orderdate 31/01/47 |
productid 432 455 467 |
quan 20 2 1 |
|
|
ตารางที่ผ่านการ normalization ในระดับ 1NF
| orderid |
orderdate |
productid |
quan |
| 305 |
31/01/47 |
432 |
20 |
| 305 |
31/01/47 |
455 |
2 |
| 305 |
31/01/47 |
467 |
1 |
|
|
5.2 เปลี่ยนจาก 1NF เป็น 2NF(Second Normal Form) คือการเปลี่ยนตารางที่มีปัญหา 4 ประการ
- วิธีพิจารณาเปลี่ยน 1NF เป็น 2NF คือ ไม่มี non key ตัวใด ไม่สัมพันธ์กับ primary key (ให้พิจารณาเฉพาะ non key และ primary key)
- สิ่งที่ได้จากตาราง 1 ตาราง จะแตกออกมาเป็นหลายตาราง
- 5.2.1 แก้ไขข้อมูล ต้องแก้หลายระเบียน
- 5.2.2 มีข้อมูลเดียวกันในหลายระเบียน อาจขัดแย้งกันได้
- 5.2.3 การเพิ่มข้อมูลทำได้ยาก
- 5.2.4 การลบข้อมูลทำได้ยาก
ท่านลองพิจารณา Schema ของตารางนี้ว่าจะแยกได้กี่ตาราง
จาก orderid,custid,custname,date,proid,proname,price,quantity,categoryid,categoryname
เป็น orders (orderid,custid,custname,date,proid,proname,price,quantity)
เป็น categories (categoryid,categoryname)
เหตุที่แยก categories ออกมา เพราะ categoryid ไม่สัมพันธ์กับ orderid แต่สัมพันธ์กับ proid โดยตรง จึงต้องแยกออกมา
5.3 เปลี่ยนจาก 2NF เป็น 3NF(Third Normal Form) คือแก้ปัญหายังไม่หมด อาจยังมีข้อมูลที่มีปัญหาอีก จึงต้องทำ 3NF
- วิธีพิจารณาเปลี่ยน 2NF เป็น 3NF คือ ไม่มี non key ตัวใด ขึ้นอยู่กับ non key ตัวอื่นใน entity เดียวกัน (ให้พิจารณาเฉพาะ non key และ non key)
จาก orders (orderid,custid,custname,date,proid,proname,price,quantity)
เป็น orders (orderid,custid,date)
เป็น customers (custid,custname)
เป็น order details (orderid,proid,price,quantity)
เป็น products (proid,proname)
ตัวอย่าง 5.1 ตารางที่ยังไม่ทำ normalization (จากเอกสารของผู้ใช้ที่ส่งให้นักวิเคราะห์)
เป็นตารางการสั่งซื้อ ให้ท่านลองนำไปทำ normalization
orderid 301 |
orderdate 15/12/46 |
productid 401 402 |
quan 2 5 |
| 302 |
16/12/46 |
402 405 406 |
4 4 1 |
ตัวอย่าง 5.2 ตารางที่ยังไม่ทำ normalization (จากเอกสารของผู้ใช้ที่ส่งให้นักวิเคราะห์)
เป็นตารางเงินเดือน ให้ท่านลองนำไปทำ normalization
saleid 101
|
salesalary 2000 |
saleposition sale |
custid 201 202 203 204 |
custname tom dang boy girl |
ตัวอย่าง 5.3 ใบเสร็จ 2 ใบ เลขที่ A0001 และ A0002 (ให้ท่านลองนำไปทำ normalization)
ตัวอย่างนี้ได้รับการเสนอแนะจาก sudomvon@minebea.co.th
Invoice No.: A0001
Date: 24/10/2004
Sold to: ABC company
Item Quantity UnitPrice Amount
Pen 50 3 150
Book 100 5 500
Ruler 20 2 40
Total 690
Invoice No.: A0002
Date: 24/10/2004
Sold to: XYZ company
Item Quantity UnitPrice Amount
Pen 100 3 300
Book 120 5 600
Ruler 50 2 100
Total 1000
|
การทำ Normalization ของตัวอย่าง 5.3 (ได้รับคำแนะนำจาก อ.อมรทิพย์ rung@yonok.ac.th)
การเริ่มต้นทำ normalization ต้องนำข้อมูลมาสร้าง ตารางเริ่มต้น ซึ่งเป็นขั้นตอนก่อนการทำ 1NF
โดยไม่เขียน amount และ total เพราะเป็นค่าที่เกิดจากการคำนวณเท่านั้น
ตาราง temp
A0001,24/10/2004,ABC company,Pen,50,3
A0001,24/10/2004,ABC company,Book,100,5
A0001,24/10/2004,ABC company,Ruler,20,2
A0002,24/10/2004,XYZ company,Pen,100,3
A0002,24/10/2004,XYZ company,Book,120,5
A0002,24/10/2004,XYZ company,Ruler,50,2
การทำ 1NF ของ ตัวอย่าง 5.3 นำตารางเริ่มต้นมาจัดการเรื่อง multivalue เช่น คนชอบกินหลายอย่าง หรือการเพิ่ม key ประกอบข้อมูลที่อาจซ้ำ
ตัวอย่างนี้เพิ่มรหัสลูกค้า และรหัสสินค้า เป็น key เพราะคิดว่า ชื่อลูกค้า และชื่อสินค้า อาจมีโอกาสซ้ำกันได้ และไม่เหมาะที่จะเป็น key
ตาราง tempoforder
A0001,24/10/2004,101,ABC company,201,Pen,50,3
A0001,24/10/2004,101,ABC company,202,Book,100,5
A0001,24/10/2004,101,ABC company,203,Ruler,20,2
A0002,24/10/2004,102,XYZ company,201,Pen,100,3
A0002,24/10/2004,102,XYZ company,202,Book,120,5
A0002,24/10/2004,102,XYZ company,203,Ruler,50,2
การทำ 2NF ของ ตัวอย่าง 5.3 แยกตาราง tempoforder เป็นหลายตาราง และทุกตารางมี primary key ที่มีการตรวจสอบการขึ้นตรงอย่างถูกต้อง
primay key คือ รหัสใบสั่งซื้อ
ตาราง invoid_1
A0001,24/10/2004,101,ABC company
A0002,24/10/2004,102,XYZ company
primay key คือ รหัสใบสั่งซื้อ และรหัสสินค้า
ตาราง invoid_2
A0001,201,50,3
A0001,202,100,5
A0001,203,20,2
A0002,201,100,3
A0002,202,120,5
A0002,203,50,2
ตาราง product เพราะราคาขึ้นกับรหัสสินค้า
primary key คือ รหัสสินค้า
ตาราง product
201,Pen,3
202,Book,5
203,Ruler,2
การทำ 3NF ของ ตัวอย่าง 5.3
ตาราง invoid_1 เพราะชื่อลูกค้าไม่ขึ้นกับรหัสใบสั่งซื้อ จึงต้องแยกไปทำตาราง customer
primay key คือ รหัสใบสั่งซื้อ
ตาราง invoid_1
A0001,24/10/2004,101
A0002,24/10/2004,102
ตาราง customer เพราะชื่อลูกค้าไม่ขึ้นกับ รหัสใบสั่งซื้อ แต่ขึ้นกับรหัสลูกค้า
primay key คือ รหัสลูกค้า
ตาราง customer
101,ABC company
102,XYZ company
primay key คือ รหัสใบสั่งซื้อ และรหัสสินค้า เพราะ ปริมาณ และราคาต้องขึ้นกับ key 2 ตัวนี้
ตาราง invoid_2
A0001,201,50,3
A0001,202,100,5
A0001,203,20,2
A0002,201,100,3
A0002,202,120,5
A0002,203,50,2
ตาราง product เพราะราคาขึ้นกับรหัสสินค้า
primary key คือ รหัสสินค้า
ตาราง product
201,Pen,3
202,Book,5
203,Ruler,2
ตารางความสัมพันธ์ (Relational Table)
Computer Hardware Information System Management ของ อ.ถนอม (thanom.net)
|