วันเสาร์ที่ 26 มกราคม พ.ศ. 2562

SQLite

บทความนี้จะกล่าวถึงการติดตั้งและการใช้งานระบบฐานข้อมูล SQLite 3 ผ่านระบบปฏิบัติการ Ubuntu

ขั้นตอนการติดตั้ง

    เนื่องด้วยผู้เขียนนั้นใช้ระบบปฏิบัติการ Windows 10 เป็นหลักและได้ทำการติดตั้ง Sub-system ไว้แล้ว ซึ่ง Ubuntu Sub-system เป็น Application ที่สามารถติดตั้งได้โดยตรงจาก Microsoft Store
หากสนใจวิธีให้ทำการติดตั้งตามวิธีใน Link (https://docs.microsoft.com/en-us/windows/wsl/install-win10)


  1. ให้ทำการ update apt package โดยใช้คำสั่ง sudo apt-get update
  2. ติดตั้ง SQLite โดยใช้คำสั่ง sudo apt-get install sqlite3
  3. ทำการตรวจสอบว่าติดตั้งได้ถูกต้องโดยใช้คำสั่ง sqlite3 --version

สร้างฐานข้อมูล

เริ่มต้นโดยการสร้างฐานข้อมูลสามารถทำได้โดยเข้าสู่ SQLite ผ่านคำสั่ง
sqlite3 bap.db
โดยชื่อไฟล์ที่ใส่เข้าไปเป็น argument นั่นก็คือชื่อของไฟล์ Database ที่เราต้องการเก็บข้อมูลไว้
หากไม่ได้ใส่ชื่อไว้ การใช้งาน SQLite จะเป็นแบบใช้ memory เท่านั้นไม่ได้เก็บบันทึกข้อมูลไว้

สร้างตาราง


  1. ทำการสร้างตารางของ publisher โดยใช้คำสั่ง

    CREATE TABLE publisher (publisher_id INTEGER PRIMARY KEY AUTOINCREMENT, publisher_name TEXT NOT NULL, location TEXT NOT NULL, publisher_tel TEXT NOT NULL);
  2. ทำการสร้างตารางของ authorโดยใช้คำสั่ง

    CREATE TABLE author (author_id INTEGER PRIMARY KEY AUTOINCREMENT, author_name TEXT NOT NULL, author_address TEXT, author_tel TEXT, author_ssn TEXT UNIQUE, publisher_id INTEGER NOT NULL, FOREIGN KEY(publisher_id) REFERENCES publisher(publisher_id));

    จะเห็นได้ว่าในตารางนี้มีการเพิ่ม FOREIGN KEY เข้าไปเพื่อทำการเชื่อมตาราง Author และ Publisher เข้าด้วยกันโดยใช้ publisher_id เป็น foreign key
  3. ทำการสร้างตารางของ book ใช้คำสั่ง

    CREATE TABLE book (book_id INTEGER PRIMARY KEY AUTOINCREMENT, book_name TEXT NOT NULL, release_date TEXT NOT NULL, copy INTEGER NOT NULL, publisher_id INTEGER, FOREIGN KEY(publisher_id) REFERENCES publisher(publisher_id));

    จะเห็นได้ว่าในตารางนี้มีการเพิ่ม FOREIGN KEY เข้าไปเพื่อทำการเชื่อมตาราง book และ Publisher เข้าด้วยกันโดยใช้ publisher_id เป็น foreign key
  1. ทำการสร้างตารางของ book_author เนื่องจากความสัมพันธ์ของ book และ author เป็นแบบ M:N หรือแบบ Many to Many โดยใช้คำสั่ง

    CREATE TABLE book_author (book_id INTEGER, author_id INTEGER, FOREIGN KEY(book_id) REFERENCES book(book_id),FOREIGN KEY(author_id) REFERENCES author(author_id));

    โดยตารางนี้จะมี key อยู่ 2 อันนั้นก็คือ book_id และ author_id ซึ่งใช้เป็นการเชื่อมกันระหว่างตาราง book และ author

ทดสอบตาราง

ข้อสังเกต หากไม่แน่ใจว่า SQLite ได้ทำการ enable foreign key แล้วหรือไม่ ให้ใช้คำสั่ง
                   PRAGMA foreign_keys;
                 หากค่าที่ส่งกลับมาเป็น 0 แสดงว่า SQLite ยังไม่ได้เปิดใช้งาน Foreign key
                 สามารถเปิดใช้งานได้โดยใช้คำสั่ง
                  PRAGMA foreign_keys = ON;
                หลังจากนั้นให้ทดสอบโดยใช้คำสั่งแรกอีกครั้ง หากได้ค่าที่ส่งกลับเป็น 1 หมายความว่า                          สามารถใช้งาน Foreign Key ได้แล้ว

ทดสอบการเพิ่มข้อมูลสำหรับ publisher

ใช้คำสั่ง
INSERT INTO publisher (publisher_name, publisher_address, publisher_tel) VALUES ("Fah Sai", "Bangkok", "029523875"); 
INSERT INTO publisher (publisher_name, location, publisher_tel) VALUES ("Pearson Education Limited", "United Kingdom", "020 7010 2336"); 
INSERT INTO publisher (publisher_name, location, publisher_tel) VALUES ("Mcgraw-hill International Enterprises", "United States", "212-904-2078");                                                                  

ทดสอบการเพิ่มข้อมูลสำหรับ author

ใช้คำสั่ง
INSERT INTO author (author_name, author_address, publisher_id) VALUES ("William Stallings", "USA", 2); 
INSERT INTO author (author_name, author_address, publisher_id) VALUES ("Robert W. Sebesta", "Colorado", 2); 
INSERT INTO author (author_name, author_address, publisher_id) VALUES ("Barry B. Brey", "USA", 2); 
INSERT INTO author (author_name, author_address, publisher_id) VALUES ("Stephen P. Robbins", "USA", 2); 
INSERT INTO author (author_name, author_address, publisher_id) VALUES ("Michael J Kroes", "USA", 3); 
INSERT INTO author (author_name, author_address, publisher_id) VALUES ("Stephen A. Ross", "USA", 3); 

โดยหากถ้าเราใส่ publisher_id ที่ไม่มีอยู่จริง จะได้รับ Error ดังนี้
 Error: FOREIGN KEY constraint failed
เนื่องจากติดเงื่อนไขของ foreign key นั่นเอง

ทดสอบการเพิ่มข้อมูลสำหรับ book


ใช้คำสั่ง

INSERT INTO book (book_name, release_date, copy, publisher_id) VALUES ("Concepts of Programming Languages", "2013", "10", 2); 
INSERT INTO book (book_name, release_date, copy, publisher_id) VALUES ("Programming the World Wide Web", "2013", "7", 2); 
INSERT INTO book (book_name, release_date, copy, publisher_id) VALUES ("The Intel Microprocessors : Architecture, Programmi", "2008", "8", 2); 
INSERT INTO book (book_name, release_date, copy, publisher_id) VALUES ("Management", "2015", "13", 2); 
INSERT INTO book (book_name, release_date, copy, publisher_id) VALUES ("Aircraft Basic Science", "2013", "8", 3); 
INSERT INTO book (book_name, release_date, copy, publisher_id) VALUES ("Essentials of Corporate Finance", "2002", "3", 3); 
INSERT INTO book (book_name, release_date, copy, publisher_id) VALUES ("Egypt in Spectacular Cross-Section", "2005", "1", 3); 
INSERT INTO book (book_name, release_date, copy, publisher_id) VALUES ("Fundamentals of Corporate Finance Alternate Edition 9ED (P)", "2010", "9", 3); 
INSERT INTO book (book_name, release_date, copy, publisher_id) VALUES ("Corporate Finance : Corporate Principles", "2007", "1", 3);

ทดสอบการเพิ่มข้อมูลสำหรับ book_author


ใช้คำสั่ง
INSERT INTO book_author (book_id, author_id) VALUES (1, 1) -- Computer Organization and Architecture, William Stallings; 
INSERT INTO book_author (book_id, author_id) VALUES (2,2) -- Concepts of Programming Languages, Robert W. Sebesta; 
INSERT INTO book_author (book_id, author_id) VALUES (3,2) -- Programming the World Wide Web, Robert W. Sebesta; 
INSERT INTO book_author (book_id, author_id) VALUES (4,3) -- The Intel Microprocessors : Architecture, Programmi, Barry B. Brey; 
INSERT INTO book_author (book_id, author_id) VALUES (5,4) -- Management, Stephen P. Robbins; 
INSERT INTO book_author (book_id, author_id) VALUES (6,5) -- Aircraft Basic Science, Michael J Kroes; 
INSERT INTO book_author (book_id, author_id) VALUES (7,6) -- Essentials of Corporate Finance, Stephen A. Ross; 
INSERT INTO book_author (book_id, author_id) VALUES (8,6) -- Egypt in Spectacular Cross-Section, Stephen A. Ross; 
INSERT INTO book_author (book_id, author_id) VALUES (9,6) -- Fundamentals of Corporate Finance Alternate Edition 9ED (P), Stephen A. Ross; 
INSERT INTO book_author (book_id, author_id) VALUES (10,6) -- Corporate Finance : Corporate Principles, Stephen A. Ross;
เช่นเดียวกับกรณีของ author หากใส่ id ที่ไม่มีอยู่จริงก็จะได้รับ Contraint Error

ทดสอบการ Query ข้อมูล

การทดสอบสามารถทำโดยใช้ SQL SELECT Statement

ตัวอย่างการ Query ข้อมูลทั้งหมดของ book

SELECT * FROM book; 

ผลลัพธ์ที่ได้ 

1||Computer Organization and Architecture|2013|9|2
2||Concepts of Programming Languages|2013|10|2
3||Programming the World Wide Web|2013|7|2
4||The Intel Microprocessors : Architecture, Programmi|2008|1|2
5||Management|2015|13|2
6||Aircraft Basic Science|2013|8|3
7||Essentials of Corporate Finance|2002|3|3
8||Egypt in Spectacular Cross-Section|2005|1|3
9||Fundamentals of Corporate Finance Alternate Edition 9ED (P)|2010|9|3
10||Corporate Finance : Corporate Principles|2007|1|3

ตัวอย่างการ Query ข้อมูลทั้งหมดของ author

SELECT * FROM author; 

 ผลลัพธ์ที่ได้ 

1||William Stallings|USA|||2
2||Robert W. Sebesta|Colorado|||2
3||Barry B. Brey|USA|||2
4||Stephen P. Robbins|USA|||2
5||Michael J Kroes|USA|||3
6||Stephen A. Ross|USA|||3

ตัวอย่างการ Query ข้อมูลทั้งหมดของ publisher

SELECT * FROM publisher; 

 ผลลัพธ์ที่ได้ 

1||Fah Sai|Bangkok|0971073060
2||Pearson Education Limited|United Kingdom|020 7010 2336
3||Mcgraw-hill International Enterprises|United States|212-904-2078








วันจันทร์ที่ 21 มกราคม พ.ศ. 2562

SQL Statements

ในบทความจะกล่าวคำสั่งที่ใช้ทำงานต่างๆ ของฐานข้อมูล โดยตัวอย่างที่ยกขึ้นมาอธิบายมีดังนี้
  1. SELECT
  2. SELECT DISTINCT
  3. WHERE
  4. AND, OR, NOT
  5. ORDER BY
  6. INSERT INTO
  7. NULL
  8. UPDATE
  9. DELETE

1. SELECT

เป็นคำสั่งที่ใช้ในการเลือกข้อมูลจาก Database. ข้อมูลที่ส่งกลับมาจะถูกเก็บไว้ในตารางผลลัพธ์

ตัวอย่างการใช้งาน

SELECT CustomerName, City FROM Customers;

ผลลัพธ์ที่ได้

CustomerNameCity
Alfreds FutterkisteBerlin
Ana Trujillo Emparedados y heladosMéxico D.F.
Antonio Moreno TaqueríaMéxico D.F.
Around the HornLondon
Berglunds snabbköpLuleå
Blauer See DelikatessenMannheim
Blondel père et filsStrasbourg
Bólido Comidas preparadasMadrid
Bon app'Marseille
Bottom-Dollar MarketseTsawassen
B's BeveragesLondon
Cactus Comidas para llevarBuenos Aires
Centro comercial MoctezumaMéxico D.F.

2. SELECT DISTINCT

เป็นคำสั่งที่ใช้ในการเลือกข้อมูลจาก Database. ข้อมูลที่ส่งกลับมาจะเป็นข้อมูลที่แตกต่างกันเท่านั้น

ตัวอย่างการใช้งาน

SELECT DISTINCT Country FROM Customers;

ผลลัพธ์ที่ได้

Country
Germany
Mexico
UK
Sweden
France
Spain
Canada
Argentina
Switzerland
Brazil
Austria
Italy
Portugal
USA
Venezuela
Ireland
Belgium
Norway
Denmark
Finland
Poland

3. WHERE

เป็นคำสั่งที่ในการ filter ข้อมูลที่ต้องการตามเงื่อนไขที่กำหนด (Condition) 

ตัวอย่างการใช้งาน

SELECT * FROM Customers WHERE Country='Mexico';

ผลลัพธ์ที่ได้

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico
13Centro comercial MoctezumaFrancisco ChangSierras de Granada 9993México D.F.05022Mexico
58Pericles Comidas clásicasGuillermo FernándezCalle Dr. Jorge Cash 321México D.F.05033Mexico
80Tortuga RestauranteMiguel Angel PaolinoAvda. Azteca 123México D.F.05033Mexico

4. AND, OR, NOT

ทั้ง 3 คำสั่งนี้เป็นคำสั่งทางลอจิก ซึ่งใช้ในการ filter ตามเงื่อนไขที่มากกว่า 1 เงื่อนไข

ตัวอย่างการใช้งาน

SELECT * FROM Customers
WHERE Country='Germany' AND City='Berlin';

ผลลัพธ์ที่ได้

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany

ตัวอย่างการใช้งาน

SELECT * FROM Customers
WHERE City='Berlin' OR City='München';

ผลลัพธ์ที่ได้

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1Alfreds
Futterkiste
Maria AndersObere Str. 57Berlin12209Germany
25FrankenversandPeter FrankenBerliner Platz 43München80805Germany

ตัวอย่างการใช้งาน

SELECT * FROM Customers
WHERE NOT Country='Germany';

ผลลัพธ์ที่ได้

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico
4Around the HornThomas Hardy120 Hanover Sq.LondonWA1 1DPUK
5Berglunds snabbköpChristina BerglundBerguvsvägen 8LuleåS-958 22Sweden
7Blondel père et filsFrédérique Citeaux24, place KléberStrasbourg67000France
8Bólido Comidas preparadasMartín SommerC/ Araquil, 67Madrid28023Spain
9Bon app'Laurence Lebihans12, rue des BouchersMarseille13008France

5. ORDER BY

เป็นคำสั่งที่ใช่การ Sorting หรือเรียงข้อมูล โดยมีตัวเลือก 2 แบบคือ ASC (Ascending) หรือ DESC (Descending) โดยค่าเริ่มต้นของ Order By จะเป็น ASC

ตัวอย่างการใช้งาน

SELECT * FROM Customers
ORDER BY Country;

ผลลัพธ์ที่ได้

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
12Cactus Comidas para llevarPatricio SimpsonCerrito 333Buenos Aires1010Argentina
54Océano Atlántico Ltda.Yvonne MoncadaIng. Gustavo Moncada 8585 Piso 20-ABuenos Aires1010Argentina
64Rancho grandeSergio GutiérrezAv. del Libertador 900Buenos Aires1010Argentina
20Ernst HandelRoland MendelKirchgasse 6Graz8010Austria
59Piccolo und mehrGeorg PippsGeislweg 14Salzburg5020Austria
50Maison DeweyCatherine DeweyRue Joseph-Bens 532BruxellesB-1180Belgium
76Suprêmes délicesPascale CartrainBoulevard Tirou, 255CharleroiB-6000Belgium
15Comércio MineiroPedro AfonsoAv. dos Lusíadas, 23São Paulo05432-043Brazil
21Familia ArquibaldoAria CruzRua Orós, 92São Paulo05442-030Brazil
31Gourmet LanchonetesAndré FonsecaAv. Brasil, 442Campinas04876-786Brazil

6. INSERT INTO

เป็นคำสั่งที่ใช้ในการนำข้อมูลใหม่ใส่เข้าในฐานข้อมูล

ตัวอย่างการใช้งาน

INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
VALUES ('Cardinal''Tom B. Erichsen''Skagen 21''Stavanger''4006''Norway');

ผลลัพธ์ที่ได้

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
89White Clover MarketsKarl Jablonski305 - 14th Ave. S. Suite 3BSeattle98128USA
90Wilman KalaMatti KarttunenKeskuskatu 45Helsinki21240Finland
91WolskiZbyszekul. Filtrowa 68Walla01-012Poland
92CardinalTom B. ErichsenSkagen 21Stavanger4006Norway

7. NULL

เป็นเงื่อนไขหรือประเภทของข้อมูลที่มีไม่มีค่า

ตัวอย่างการใช้งาน

SELECT CustomerName, ContactName, Address
FROM Customers
WHERE Address IS NOT NULL;

ผลลัพธ์ที่ได้

CustomerNameContactNameAddress
Alfreds FutterkisteMaria AndersObere Str. 57
Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222
Antonio Moreno TaqueríaAntonio MorenoMataderos 2312
Around the HornThomas Hardy120 Hanover Sq.
Berglunds snabbköpChristina BerglundBerguvsvägen 8
Blauer See DelikatessenHanna MoosForsterstr. 57
Blondel père et filsFrédérique Citeaux24, place Kléber
Bólido Comidas preparadasMartín SommerC/ Araquil, 67
Bon app'Laurence Lebihans12, rue des Bouchers
Bottom-Dollar MarketseElizabeth Lincoln23 Tsawassen Blvd.
.........

8. UPDATE

เป็นคำสั่งที่ใช้แก้ไขข้อมูลภายในฐานข้อมูล

ตัวอย่างการใช้งาน

UPDATE Customers
SET ContactName = 'Alfred Schmidt', City= 'Frankfurt'
WHERE CustomerID = 1;

ผลลัพธ์ที่ได้

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1Alfreds FutterkisteAlfred SchmidtObere Str. 57Frankfurt12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico
4Around the HornThomas Hardy120 Hanover Sq.LondonWA1 1DPUK
5Berglunds snabbköpChristina BerglundBerguvsvägen 8LuleåS-958 22Sweden

9. DELETE

เป็นคำสั่งที่ใช้ลบข้อมูลภายในฐานข้อมูล

ตัวอย่างการใช้งาน

DELETE FROM Customers WHERE CustomerName='Alfreds Futterkiste';

ผลลัพธ์ที่ได้

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico
4Around the HornThomas Hardy120 Hanover Sq.LondonWA1 1DPUK
5Berglunds snabbköpChristina BerglundBerguvsvägen 8LuleåS-958 22Sweden

วันจันทร์ที่ 14 มกราคม พ.ศ. 2562

Database Design Process

โดยหลักๆแล้วจะมีอยู่ 2 อย่างให้ทำ
  • Database Design
  • Applications Design
ในบทนี้จะสนใจไปที่ Conceptual database design เพื่อที่จะออกแบบ Conceptual schema
ให้กับ Database application

Methodologies

ที่จะพูดถึงใน chapter นี้ก็คือ ER Diagram (Entity Relationship)
หากเราจะต้องการที่สร้างและออกแบบ Database schema design 
เราจะต้องทราบถึง requirements ต่างๆที่เราต้องการใช้เป็นส่วนประกอบในการออกแบบ

ER Model Concepts

  • Entity เป็นแนวคิดพื้นฐานที่ใช้สำหรับ ER model
  • Entity เป็นสิ่งที่เป็นตัวแสดง หรือตัวแทน ของสิ่ง หรือ object ที่อยู่ใน Database
  • โดยที่ Entity ก็มี Attributes เป็นสิ่งที่ใช้อธิบายตัว Entity

Types of Attributes

  • Simple เป็นค่าที่เป็นค่าเดี่ยวๆ เช่น SSN
  • Composite เป็นค่าที่ประกอบไปด้วยหลายๆค่าอยู่ด้วยกัน เช่น ชื่อ (ชื่อแรก, ชื่อกลาง, นามสกุล)
  • Multi-valued เป็น attributes เดียวที่มีหลายค่าสำหรับ attribute นั้นๆ

Entity Type


  • ใน ER Diagram สำหรับ Entity Type จะถูกแสดงอยู่ภายใน กล่องสี่เหลี่ยม
  • ส่วน Attributes จะถูกแสดงอยู่ภายใน วงรี

3 main concepts of ER model

  • Entities
  • Attributes
  • Relationships

Relationships

เป็นการแสดงถึงความสัมพันธ์ของ Entity 2 อันหรือมากกว่า อย่างมีความหมาย เช่น
EMPLOYEE John works on the Moto PROJECT

Constraints on Relationships

Cardinality Ratio (แสดงถึงค่ามากที่สุดที่เกี่ยวข้อง)

  • One-to-one (1:1)
  • One-to-many (1:N) หรือ Many-to-one (N:1)
  • Many-to-many (M:N)

Participation Constraint  (แสดงถึงค่าน้อยที่สุดที่เกี่ยวข้อง)

  • zero
  • one or more

 

วันศุกร์ที่ 4 มกราคม พ.ศ. 2562

Week 2 GPA DB by CSV


บทความนี้จะมีความต่อเนื่องจาก บทความที่แล้ว (Week 1) โดยบทความนี้จะกล่าวถึง การ Export CSV จาก Google Speadsheet และนำไปเป็นชุดข้อมูล ที่จะใช้ในโปรแกรมคำนวณเกรด ต่อไป

ขั้นตอนการ Export CSV


แล้วเราก็จะได้ไฟล์ CSV จาก Google Spreadsheet มาโดยข้างในไฟล์จะมีข้อมูลลักษณะนี้


Course Id,Course Name,Year,Semester,Credit,Section,Grade,Grade(Score)
010013001,INTRODUCTION TO ENGINEERING,2559,1,1,1,B,3.0
010123102,PROGRAMMING FUNDAMENTALS,2559,1,3,1,A,4.0
010123130,COMPUTER ENGINEERING EXPLORA,2559,1,1,1,A,4.0
040203111,ENGINEERING MATHEMATICS I,2559,1,3,4,B,3.0
040313005,PHYSICS I,2559,1,3,3,B,3.0
040313006,PHYSICS LABORATORY I,2559,1,1,4,A,4.0

เมื่อได้ไฟล์ที่เราต้องการแล้ว ต่อไปจะเป็นการอธิบายการเขียนโปรแกรมคำนวณเกรดและเก็บข้อมูลจาก CSV

โดยโปรแกรมนี้จะเขียนด้วย ภาษา Python (3) และมีการใช้ Libraries ต่างๆดังนี้


วิธีการติดตั้งโปรแกรม

  1. เปิด Terminal หรือ cmd
  2. ตรวจสอบว่าบนเครื่องได้ติดตั้ง pip (Python Package Installer)ไว้หรือยัง
  3. หากยังไม่ได้ติดตั้งให้ทำตามเอกสารนี้ครับ https://pip.pypa.io/en/latest/installing/
  4. หากติดตั้งแล้วให้ใช้คำสั่งที่ Terminal    =>   "pip install gradedb"
  5. ทดสอบว่า Package ได้ถูกติดตั้งอย่างสมบูรณ์   =>  "pip show gradedb"
        เนื่องจากโปรแกรมนี้ไม่มี GUI (Graphic User Interface) และเป็นแบบ Text-base ทำให้ผมเลือกใช้ Library เข้ามาช่วยในการ Interact กับผู้ใช้งาน โดยเลือกใช้ PyInquirer มาเป็นตัวควบคุมการสั่งทำงานเป็นหลัก โดยผมออกแบบให้ทำงานเป็น CLI มากที่สุด ซึ่งจะต้องเรียกใช้งานโปรแกรมผ่านทาง cmd
หรือ terminal เท่านั้น (เป็นข้อจำกัดของ PyInquirer)

วิธีการเริ่มต้นใช้งาน

  1. เปิด Terminal หรือ cmd
  2. ใช้คำสั่ง   "gradedb" หรือ "gradedb filename.csv" ซึ่ง filename.csv ก็คือ ที่อยู่ของไฟล์ CSV ที่เราเตรียมไว้ใช้งาน

และนี่คือหน้าตาของโปรแกรมตอนเริ่มการทำงาน


เมื่อเริ่มต้นการทำงานก็จะเจอกับเมนูให้เลือกการทำงาน โดยจะมีให้เลือก 6 ตัวเลือก ประกอบไปด้วย
  1. Insert  เป็น Mode การเพิ่มวิชาเรียนเข้าสู่ฐานข้อมูล
  2. Update เป็น Mode การแก้ไขฐานข้อมูลที่มีอยู่
  3. Summary เป็นการแสดงฐานข้อมูลปัจจุบัน
  4. Calculate GPA เป็นการคำนวณเกรดเฉลี่ยทั้งหมดหรือในแต่ละเทอม
  5. Save and Close เป็นการ Save ฐานข้อมูลปัจจุบันลงไปที่ไฟล์ CSV และทำการปิดโปรแกรม
  6. Close เป็นการปิดโปรแกรม

อธิบายการออกแบบระบบของโปรแกรม

        ในส่วนระบบของโปรแกรม ตัวชุดของข้อมูลหรือฐานข้อมูล นั้นจะถูกเก็บอยู่ในรูปแบบของ DataFrame ซึ่งมาจาก pandas โดยเริ่มต้น ข้อมูลจะโหลดเข้ามาในโปรแกรม จากไฟล์ CSV เข้ามาเก็บใน memory ซึ่งภายใน DataFrame นั้นจะมีโครงสร้างที่สะดวกและเข้าใจง่ายในการเก็บข้อมูลที่มีลักษณะเป็นตาราง (Table) ทำให้เราสามารถจัดการกับข้อมูลภายใน DataFrame ได้สะดวกขึ้น

อธิบายการทำงานของแต่ละ Mode

Insert Mode
        เมื่อทำการเลือก Mode นี้แล้วนั้นก็จะพบกับคำถามต่อไป ก็คือคำถามเกี่ยวกับรายละเอียดของวิชาที่เราต้องการที่จะเพิ่ม โดยรายละเอียดที่ต้องการก็จะมีดังนี้
  1. Course Id (รหัสวิชา)
  2. Course Name (ชื่อรายวิชา)
  3. Year (ปีการศึกษา)
  4. Semester (ภาคการศึกษา)
  5. Credit (หน่วยกิต)
  6. Section (ตอนเรียน)
  7. Grade (เกรด)


Update Mode
        เมื่อเลือก Update Mode แล้วก็จะคำถามให้ป้อนเลขหรือลำดับของวิชาในฐานข้อมูลที่ต้องการแก้ไขข้อมูล

และเมื่อเราเลือกวิชาที่ต้องการแล้วก็จะมีคำถามต่อไปขึ้นมา โดยจะมีรายละเอียดเช่นเดียวกับตอนอยู่ใน Insert Mode แต่คำตอบจะถูก fill ด้วยข้อมูลที่มีอยู่แล้วในฐานข้อมูล (Default)



Summary Mode
        สำหรับ Mode เป็นแค่การแสดงฐานข้อมูลปัจจุบันขึ้นมาเท่านั้น



Calculate GPA Mode
        เป็น Mode การคำนวณเกรดเฉลี่ยหรือ GPA โดยสามารถคำนวณได้ทั้งแบบสะสมหรือแบบประจำภาค และเมื่อเข้าสู่ Mode นี้ก็จะเจอตัวเลือกว่าต้องการจะคำนวณเกรดของเทอมไหน


        ในส่วนของการคำนวณนั้น เนื่องจากโปรแกรมนี้มีวิธีการเก็บข้อมูลแบบ DataFrame ทำให้เราสามารถนำบางส่วนของข้อมูลทั้งหมด เช่น Column ของหน่วยกิต กับ Column ของเกรด(แต้ม) มาทำการคำนวณได้ โดยสูตรพื้นฐานการคำนวณเกรดเฉลี่ยนั้นก็คือ   
        ผลรวมของผลคูณระหว่างแต้มคะแนนและหน่วยกิต / ผลรวมของหน่วยกิต
โดยเมื่อเลือกเทอมที่ต้องการแล้วก็จะมีตัวเลือกให้เลือก ระหว่าง คำนวณแบบสะสม (Cumulative) หรือคำนวณแบบประจำภาค (Semester)



        หากเป็นการคำนวณเกรดเฉลี่ยแบบสะสม จะเป็นคำนวณที่เริ่มตั้งแต่เทอมแรกจนถึงเทอมที่เลือก เช่นหากต้องการที่จะคำนวณแบบสะสมใน ภาคการศึกษาที่ 2560 ภาคการศึกษาที่ 1 โปรแกรมจะต้องเริ่มหาผลรวมตั้งแต่ ภาคการศึกษาที่ 2559 ภาคการศึกษาที่ 1 จนถึง ภาคการศึกษาที่ 2560 ภาคการศึกษาที่ 1
        แต่ถ้าหากเป็นการคำนวณเกรดเฉลี่ยแบบประจำภาค จะสามารถคำนวณโดยทำการ filter ฐานข้อมูลก่อนเป็นลำดับแรกโดยจะ filter จาก ปีการศึกษา และ ภาคการศึกษาที่ต้องการ


Save and Close
        เป็นการบันทึกฐานข้อมูลที่อยู่ใน Memory ลงไปในไฟล์ CSV เพื่อให้ครั้งต่อไปที่เปิดโปรแกรมก็จะข้อมูลที่เป็นปัจจุบันหลังจากที่ได้แก้ไขไปแล้ว แล้วทำการปิดโปรแกรม

Close
        เป็นการปิดโปรแกรมโดยที่ไม่บันทึกข้อมูลปัจจุบัน

Source Code ของโปรแกรมสามารถดูได้ที่
GitHub
Bitbucket