วันอังคารที่ 27 กุมภาพันธ์ พ.ศ. 2561

Week 6

What you have done/learned

  • ทดลองการ Insert ค่าจำนวณมากเข้าไปในฐานข้อมูล MySQL Workbench
  • นำเสนอเกี่ยวกับ Project ที่มีความเกี่ยงข้องกับการใช้ฐานข้อมูลเพื่อเลือกในการนำไปศึกษาและปฏิบัติจริง โดยที่เสนอไปในสัปดาห์นี้คือ ฐานข้อมูลของคลินิกทันตกรรมหรือร้านหมอฟัน และฐานข้อมูลการจราจร

Problem/Solution

  • การ Import ข้อมูลขนาดใหญ่เข้าไปใน MySQL Workbench นั้นส่งผลให้โปรแกรมทำงานหนักเกินไปทำให้เกินการ crash หรือค้างไปทำให้ต้องปิดการใช้งาน ทำการแก้ไขโดยการ generate ข้อมูลและ Insert เข้าไปทีละตัว ซึ่งช่วยแก้ปัญหาได้จริง
  • การ Insert และ Commit ทุกครั้งนั้นทำให้การดำเนินการช้าเกินกว่าที่ควรจะเป็นอย่างมาก แก้ไขโดยการกำหนดช่วงของ loop ในการ Commit เพื่อลดปัญหาความล่าช้าของการ Insert
  • การ Insert ที่มีปริมาณข้อมูลจำนวนมากๆทำให้เป็นภาระของคอมพิวเตอร์อย่างมาก คอมพิวเตอร์ของบางคนเกิดการกระตุกและค้าง หรือบางกรณีคือต้อง Restart เนื่องจากไม่สามารถทำงานได้แก้ไขโดยการให้เพื่อนที่คอมพิวเตอร์มีประสิทธิภาพสูงทำการสร้างข้อมูลให้
  • การสื่อสารในกลุ่มค่อนข้างล้าช้าและมีปัญหา แก้ไขโดยการระบุรายละเอียดและสิ่งที่จะชี้แจงให้ละเอียดมากขึ้นเพื่อลดปัญหาการเข้าใจไม่ตรงกัน

Decision

  • เนื่องจากข้อจำกัดของคอมพิวเตอร์จึงได้ทดลองจำลองการสร้างข้อมูลที่มีขนาดไม่ใหญ่มากเพื่อลดภาระในการ Insert
  • เลือกการใช้ Select * เพื่อทดสอบการแสดงข้อมูลทั้งหมด แต่เป็นการกระทำที่ไม่เหมาะสม ดังนั้นจะมีการปรับปรุงเรื่องการเลือกใช้คำสั่ง Select ให้สื่อความหมายมากขึ้น

Related Info/Link/Reference

  • โค้ดที่ใช้ในการ Generate และ Insert ข้อมูล

    
    
  • ข้อมูลและแหล่งอ้างอิงการใช้ MySQLdb ใน PyCharm
    https://www.youtube.com/watch?v=ryLsp6m1PnY
    https://www.youtube.com/watch?v=HJ9bTO5yYw0

วันจันทร์ที่ 19 กุมภาพันธ์ พ.ศ. 2561

Week 5

What you have done/learned

  • เป็นผู้ดูแลและช่วยวิเคราะห์แผนภาพ ER ของคลินิคแห่งหนึ่ง

  • อธิบายถึงความสัมพันธ์ของแต่ละ Entity รวมไปถึงรายละเอียดของ Attributes ต่างๆ
  • เพิ่มเติมแผนภาพ ER เกม MMORPG เพื่อเสริมข้อมูลของ Participation Constraint ซึ่งในแผนภาพ ER ของคลินิคนั้นไม่มีระบุไว้
  • ได้รู้ถึงความสัมพันธ์ระหว่าง Entity และรูปแบบลักษณะของ ER Diagram ที่แตกต่างกัน

Problem/Solution

  • ปัญหาแรกที่พบคือแผนภาพที่ไปค้นหามานั้นมีลักษณะของความสัมพันธ์ที่แตกต่างกัน

    แก้ไขโดยทำการเลือกรูปแบบของแผนภาพ ER Diagram เป็นแบบ Chen
  • บางแผนภาพมีความสัมพันธ์ไม่ครบ แกไขได้โดยเพิ่มแผนภาพที่ใช้ในการอธิบายเพิ่มเติม

Decision

  • ทำการเลือกใช้ ER Diagram แบบ Chen เนื่องจากเป็นแผนภาพที่คุ้นเคยกันมากกว่าแบบอื่นๆแต่หากใช้ในการนำเสนอหรือทำงานใหญ่การใช้ Crow Foot จะเหมาะสมกว่าหรือเลือกตามที่ผู้ว่าจ้างต้องการ
  • เลือกใช้ ER Diagram ของคลินิคเนื่องจากความสัมพันธ์ไม่ซับซ้อน สามารถเข้าใจได้ง่ายเนื่องจากผู้คนคุ้นเคยกับระบบการทำงานของคลินิคในระดับหนึ่งอยู่แล้ว

Related Info/Link/Reference

  • แผนภาพ ER ของคลินิค : https://books.google.co.th/books?id=9PH74cVVjUoC&lpg=PP1&dq=functional%20and%20object%20oriented&hl=th&pg=PP1#v=onepage&q&f=false
  • คำอธิบายแผนภาพ :
    http://blog.vzmart.com/er-model-entity-relationship-model/
    http://moo-mieng.freetzi.com/page%208(6).html
  • แผนภาพ ER ของเกม MMORPG https://en.wikipedia.org/wiki/Entity%E2%80%93relationship_model#/media/File:ER_Diagram_MMORPG.png

วันอังคารที่ 6 กุมภาพันธ์ พ.ศ. 2561

Week 4

What you have done/learned

  • เป็นผู้ดูแลส่วนการจัดการข้อมูลและรูปแบบไฟล์ CSV ของกลุ่มเพื่อให้อยู่ใน Pattern เดียวกันและง่ายต่อการใช้งาน


รูปแบบการเรียงคือ รหัสนักศึกษา, รหัสวิชา, ปีการศึกษา, ภาคเรียน, เกรด และ ระดับคะแนนตามลำดับ
  • ทดลอง Import ข้อมูลของกลุ่มเข้าไปในฐานข้อมูลและ query เพื่อนำข้อมูลมาแสดง
  • ได้ทำการศึกษาเกี่ยวกับโลกาภิวัฒน์โดยเป็นผลมาจาก Internet และ Social media ซึ่งได้ผลว่ามีทั้งข้อดีคือ ทำให้การติดต่อสื่อสารนั้นไปได้ทั่วถึงมากขึ้นการเข้าถึงข้อมูลมากขึ้นส่งผลให้ผู้คนมีความสนใจมากขึ้น มีทางเลือกในการตัดสินใจมากขึ้น ทางด้านเศรษฐกิจและอุตสาหกรรมเพื่อให้ก้าวทันโลกก็ได้พัฒนาให้มีการทำธุรกิจบนโลก Internet หรือ Online Shopping เพิ่มมากขึ้น แต่ก็มีข้อเสียคือเนื่องจากข้อมูลข่าวสารต่างๆนั้นไม่สามารถยืนยันความถูกต้องได้ 100% และมีอัตราการแพร่กระจายข้อมูลที่เร็ว ดังนั้นผู้ใช้ต้องมีวิจารณญาณในการเสพข่าวหรือข้อมูลด้วย
  • ข้อมูลการทำงานและรายละเอียดต่างๆสามารถอ่านได้จากสไลด์นี้
    https://docs.google.com/presentation/d/1KdCOrstuNWe23VNU3-OAkpWpGA8NnA5K5F1JC0CzEEQ/edit#slide=id.g3095ef1418_4_0

Problem/Solution

  • ใน MySQL Workbench ไม่สามารถปรับการใส่ของข้อมูลจากการ Import ได้เช่น หากต้องการเพิ่มข้อมูลที่มีการเก็บ Primary Key นั้นไม่สามารถทำได้ แก้ไขโดยการนำ Primary Key ออกเนื่องจากข้อมูลในตารางมี Foreign Key ช่วยตรวจสอบและมีโอกาสในการซ้ำกันยากขึ้นเพราะแยกตารางการเก็บข้อมูลอย่างชัดเจนมากขึ้น

    การจัดรูปแบบของ table ในการเก็บข้อมูล

Decision

  • การทำ Primary Key จากการการ Import นั้นทำได้ยากจึงตัดสินใจลบ Primary Key ออกจาก table
  • ทำการแยก table ของข้อมูลออกเป็น 3 ตารางเพื่อให้ง่ายต่อการจัดการข้อมูล
  • เลือกใช้ dbms หลักเป็น MySQL Workbench เพื่อทดสอบการทำงานว่ายากง่ายกว่า dbms ตัวอื่นหรือไม่

Related Info/Link/Reference

  • ข้อมูลของโลกาภิวัฒน์ : 
    https://th.wikipedia.org/wiki/โลกาภิวัตน์
  • Link สำหรับอ่านสไลด์ : https://docs.google.com/presentation/d/1KdCOrstuNWe23VNU3-OAkpWpGA8NnA5K5F1JC0CzEEQ/edit#slide=id.g3095ef1418_4_0

วันอังคารที่ 30 มกราคม พ.ศ. 2561

Week 3

What have you done/learned

  • คำสั่ง Select ใช้สำหรับเลือกข้อมูลจาก column ที่เราสนใจใน table นั้น โดยสามารถเลือกแบบเฉพาะ column หรือทั้งหมดได้

การเลือกเฉพาะ column




การเลือกทุกข้อมูลใน table
  • คำสั่ง Select Distinct ให้ในการเลือกข้อมูลที่ไม่ซ้ำกันมาแสดง


    กรณีใช้ Select ปกติ



    กรณีใช้ Select Distinct
  • คำสั่ง Where ใช้สำหรับกำหนดเงื่อนไขการแสดงของข้อมูลในกรณีที่เราต้องการดูทุก column ซึ่งต่างจาก Select ที่จะทำได้แค่เลือกบาง column หรือทั้งหมด

    การแสดงข้อมูลเมื่อใช้ Where คู่กับ Select
  • คำสั่ง And, Or หรือ Not จะให้ควบคู่กับ Where เพื่อลดขอบเขตของข้อมูลที่ต้องการจะนำมาแสดงโดยที่ And เงื่อนไขต้องถูกต้องทั้ง 2 กรณีหรือมากกว่าถึงจะนำข้อมูลมาแสดง, Or เงื่อนไขต้องถูกอย่างน้อย1ตัวถึงนำข้อมูลมาแสดง และ Not เงื่อนไขต้องไม่ใช่ตามที่กำหนดไว้ถึงจะนำข้อมูลมาแสดง

    ตัวอย่างการใช้เงื่อนไข And
  • คำสั่ง Order By ใช้ร่วมกับ Select โดยจะทำการเรียงลำดับ column ตามที่เรากำหนดโดย ASC คือการไล่จากน้อยไปมาก และ DESC คือการไล่จากมากไปน้อย

    การลำดับข้อมูลจากลำดับตัวอักษรของ Country
  • คำสั่ง Insert Into เป็นคำสั่งในการเพิ่มข้อมูลเข้าไปใน table ที่เราต้องการโดยสามารถระบุ column ที่เราต้องการใส่ค่าได้

    การเพิ่มข้อมูลลงใน table โดยใช้ Insert Into
  • คำสั่ง Is Null และ Is Not Null จะใช้ร่วมกับ Where เพื่อเลือกข้อมูลตามเงื่อนไขเช่น Is Null คือ column นั้นต้องไม่มีข้อมูลถึงจะเอาไปใช้ และ Is Not Null คือ column นั้นต้องมีข้อมูลถึงจะนำมาแสดง

    ตัวอย่างการใช้ Is Null เพื่อแสดงข้อมูลที่มี column ที่ไม่มีข้อมูลหรือเป็น Null อยู่
  • คำสั่ง Update จะใช้ร่วมกับ Where เพื่อใช้แก้ไขข้อมูลใน row นั้นๆ ตามตำแหน่งที่กำหนด

    การใช้คำสั่ง Update ในการแก้ไขข้อมูลใน row
  • คำสั่ง Delete ใช้ในการลบข้อมูลใน row ที่เราต้องการออกไปจาก table

    การใช้ Delete ลบข้อมูลของ Alfreds Futtekiste ออกจาก table
  • คำสั่ง Select Top ใช้ในการจำกัดผลการแสดงข้อมูลให้เป็นตามที่เรากำหนดเล่น Top 3 คือเอาข้อมูลของ 3 คนแรกสุด หรือใช้ Limit ก็มีผลเช่นเดียวกัน โดยสามารถใช้ร่วมกับ Where เพื่อจำกัดขอบเขตการค้นหาและแสดงข้อมูลได้

    การแสดงผลข้อมูล 3 คนแรกสุดโดยใช้ Top
  • คำสั่ง Min/Max จะใช้ในการเลือกข้อมูลตัวที่น้อยที่สุดหรือมากที่สุดมาแสดงโดยใช้ As และตามด้วยชื่อของ column ที่จะใช้เก็บข้อมูล โดยผลที่ได้จะแสดงใน column ที่เราตั้งชื่อไว้

    การหาข้อมูลราคาที่น้อยที่สุดโดยใช้ Min
  • คำสั่ง Count, Avg และ Sum เป็นคำสั่งสำหรับใช้เพื่อคำนวณโดย Count จะใช้นับข้อมูลที่สนใจ Avg จะใช้หาค่าเฉลี่ยของข้อมูลที่เราสนใจ และ Sum จะใช้หาผลรวมของข้อมูลที่เราสนใจ โดยทั้ง3คำสั่งจะใช้ร่วมกับ Where

    ตัวอย่างการใช้ Count นับรหัสสินค้า
  • คำสั่ง Like ใช้ร่วมกับ Where ในการเพิ่มเงื่อนไขสำหรับหาข้อมูลโดยมีทั้งการหาตัวอักษรที่อยู่ขึ้นหน้า, อยู่ตรงกลาง หรืออยู่ท้ายของข้อมูล เป็นต้น

    รูปแบบการใช้ Like ต่างๆ


    ตัวอย่างการใช้ Like ในการหาชื่อลูกค้าที่ชื่อขึ้นต้นด้วย a
  • Wild Card จะเป็นการใช้ลักษณะเดียวกับ Like แต่เพิ่มลูกเล่นมากขึ้นเช่น ข้อมูลที่มีตัวอักษร _ed โดยที่ตัวอักษรตัวหน้าจะเป็นอะไรก็ได้หากมี ed ตามหลัง ก็จะดึงมาใช้เป็นต้น

    ตัวอย่างการใช้ Wild Card เพื่อหาชื่อเมืองที่ขึ้นต้นด้วย ber
  • คำสั่ง In ใช้ร่วมกับ Where เพื่อจำกัดการแสดงข้อมูลโดยสามารถเลือกได้มากกว่า 1 ตัว

    ตัวอย่างการเลือกข้อมูลมาแสดงโดยที่จำกัดประเทศเป็น UK, Germany และ France
  • คำสั่ง Between ใช้สำหรับจำกัดขอบเขตของข้อมูลที่จะแสดงให้อยู่ในช่วงที่เรากำหนดเท่านั้น

    การใช้ Between เลือกข้อมูลที่มีค่าของราคาอยู่ระหว่าง 10 ถึง 20
  • Aliases เป็นการเก็บค่าที่ต้องการจะแสดงใน column ที่เราตั้งชื่อขึ้นผ่าน As

    การใช้ As เพื่อสร้าง column สำหรับแสดงผลข้อมูลใหม่
  • คำสั่ง Inner Join ใช้สำหรับเลือกข้อมูลจาก 2 ตารางที่มีข้อมูลเหมือนกันมาแสดงผลเหมือนการ Intersection ของ Set

    ใช้ Inner Join เพื่อแสดงข้อมูล OrderID และชื่อของลูกค้าที่มีรหัสลูกค้าตรงกันทั้ง 2 tables
  • คำสั่ง Left Join ใช้สำหรับเลือกข้อมูลที่อยู่ใน table 1 ทั้งหมดและข้อมูลที่ table 1 มีตรงกันใน table 2

    การใช้ Left Join เพื่อนำข้อมูลที่อยู่ใน Customers table และที่มีตรงกับ Orders table มาแสดง โดยสามารถแสดงข้อมูลของ Customers table ได้ถึงแม้จะไม่มีข้อมูลที่ตรงกับ Orders table ก็ตาม
  • คำสั่ง Right Join ใช้สำหรับเลือกข้อมูลที่อยู่ใน table 2 ทั้งหมดและข้อมูลที่ table 2 มีตรงกันใน table 1

    การใช้ Right Join เพื่อนำข้อมูลที่อยู่ใน Employees table และที่มีตรงกับ Orders table มาแสดง โดยสามารถแสดงข้อมูลของ Employees table ได้ถึงแม้จะไม่มีข้อมูลที่ตรงกับ Orders table ก็ตาม

  • คำสั่ง Full Outer Join คือการแสดงข้อมูลของทั้ง 2 ตารางไม่ว่าจะมีเหมือนกันหรือไม่

    การแสดงผลโดยใช้ Full Outer Join รวมทั้ง 2 tables
  • Self Join ใช้หนึ่งในวิธี Join table เช่นเดียวกัน แต่เป็นการ join กับตัวเองแทนที่จะไป join กับ table อื่นๆ

    ทำการ join กับตัวเองโดยเรียก table ซ้ำ 2 ครั้งผ่านชื่อตัวแปรที่ต่างกัน
  • คำสั่ง Union ใช้สำหรับนำ table ที่มี column เหมือนกันมารวมกันและแสดงผล โดยหากทั้ง 2 tables มีค่าเหมือนกัน Union จะแสดงแค่ตัวแต่เดียว แต่ Union All จะแสดงทั้งหมดไม่ว่าจะซ้ำกันกี่ตัว

    ใช้ Union ในการรวมข้อมูลจาก column ของ table Customers และ Suppliers
  • คำสั่ง Group By มักใช้ร่วมกับคำสั่งคำนวณต่างๆเช่น Count, Sum เป็นต้น โดยจะทำการรวมกลุ่มข้อมูลที่ต้องการมาแสดงผล

    ใช้ Group By เพื่อรวบ Country ที่ซ้ำมาแสดงผลเป็นอันเดียว
  • คำสั่ง Having มีการทำงานเหมือน Where คือกำหนดเงื่อนไข แต่สามารถเพิ่มการคำนวณลงในเงื่อนไขซึ่ง Where ไม่สามารถทำได้

    ใช้ Having ในการหาข้อมูลที่มีเงื่อนไขคือ ผลรวมของรหัสลูกค้าในประเทศต้องมากกว่า 5

  • คำสั่ง Exists จะใช้ร่วมกับ Where เพื่อแสดงข้อมูลที่ตรงตามเงื่อนไขคือ ต้องมีข้อมูลตรงตามที่ Exists กำหนดไว้เท่านั้น


    แสดงข้อมูล SupplierName เมื่อ มี ProductName ที่มี SupplierID ตรงกันทั้ง 2 tables และมีราคามากกว่า 20


  • คำสั่ง Any/All จะใช้ร่วมกับ Where หรือ Having โดย Any จะแสดงข้อมูลหากมีข้อมูลตัวใดตัวหนึ่งตรงตามที่เงื่อนไขต้องการ และ All จะแสดงข้อมูลเมื่อมีข้อมูลตรงตามที่ต้องการในเงื่อนไขทุกตัว

    ตัวอย่างการใช้ Any แสดงข้อมูลชื่อผลิตภัณฑ์หากมีรหัสผลิตภัณฑ์ตัวใดตัวหนึ่งที่มีค่าเท่ากับ 10

  • คำสั่ง Select Into ใช้สำหรับย้ายข้อมูลจากตารางหนึ่งไปอีกตารางหนึ่ง


    ใช้ Select Into ย้ายข้อมูลจาก Customers ไปที่ CustomersBackup2017


  • คำสั่ง Insert Into Select เป็นคำสั่งสำหรับคัดลอกข้อมูลที่เราต้องการไป Insert ใน table ที่เราต้องการโดยต้องมีรูปแบบที่ตรงกันถึงจะ Insert ได้


    ใช้คำสั่ง Insert Into Select ในการคัดลอกข้อมูลใน Suppliers ไปเพิ่มใน Customers


  • Null Function เป็นฟังค์ชันสำหรับใช้แก้ปัญหาข้อมูลที่เป็น Null หรือไม่มีข้อมูล

    ตัวอย่างใช้ Ifnull() โดยหากค่าในฟังค์ชันเป็น Null จะแทนที่ด้วย 0
  • การ Comment เป็นการบอกรายละเอียดหรือการทำงานของโค้ดส่วนนั้นๆเพื่อให้ง่ายต่อการแก้ไขหรือนำไปพัฒนาต่อ


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

การใช้ DBMS

ตัวอย่างและวิธีการใช้งานของ MySQL Workbench สามารถดูได้ตามลิ้งค์ข้างต้น

https://docs.google.com/presentation/d/1wEolP6tf4BUR7281C-cBUWFAd23dXeVwt1_x7xMqRWc/edit#slide=id.g305d3c9174_1_125

Problem/Solution

  • การใช้งาน DBMS ของ MySQL บน Mac มีปัญหาการเปิด Server เนื่องจาก Version ไม่รองรับ แก้ไขโดยเลือกลง Version ที่ Support Mac โดยศึกษาเพิ่มเติมได้จากลิ้งค์ด้านบน

Decision

  • เลือกการทำงานของ DBMS เป็นการ import csv file ผ่านโปรแกรมโดยตรงแทนการเขียนโปรแกรมจากภายนอกเพื่อทำการ insert จากภายนอกเพื่อลดเวลาการทำงาน

Related Info/Link/Reference

  • SQL Tutorial : https://www.w3schools.com/sql/

วันอังคารที่ 23 มกราคม พ.ศ. 2561

Week 2 ( MySQL )

What have you done/learned

  • ได้ทดลองการสร้างฐานข้อมูลโดยใช้โปรแกรมของ MySQL ผ่านทาง MySQL Workbench โดยเริ่มจาการสร้างฐานข้อมูลก่อน เมื่อเข้าโปรแกรมมาแล้สวให้เลือกที่ที่ File > New Model



  • เมื่อเข้ามายังหน้าดังรูปแล้วเราสามารถเปลี่ยนชื่อของฐานข้อมูล, รหัสอักขระที่ต้องการให้รองรับ รวมไปถึงคอมเมนต์เพิ่มเติมได้โดยคลิกขวาที่ตัวฐานข้อมูลและเลือก Edit Schema


  • เมื่อแก้ไข้เรียบร้อยแล้วต่อไปจะเป็นการเพิ่มหน้า diagram ของ database โดยเลือกที่ Add Diagram ซึ่งจะนำมาสู่หน้าสำหรับออกแบบ Diagram

  • ต่อมาจะเป็นส่วนของการเพิ่มตารางฐานข้อมูลโดยให้เลือกที่ Add Table ในหน้าหลัก โดยเราสามารถตั้งชื่อตารางได้ตามที่ต้องการ เพิ่มหัวข้อในฐานข้อมูล รวมถึงกำหนดลักษณะและชนิดของข้อมูลในตารางนั้นๆได้ เช่น กำหนดให้ส่วน user_id เป็น primary key เป็นต้น



  • เราสามารถเชื่อมโยงข้อมูลในฐานข้อมูลได้โดยใช้ Foreign Key ในการเชื่อมตารางแต่ละตัวที่อยู่ในฐานข้อมูลซึ่งในแต่ละฐานข้อมูลที่จะเชื่อมกันนั้นต้องมีข้อมูลที่เป็นข้อมูลเดียวกัน


  • ในหน้าของ ERR Diagram เราสามารถนำตารางที่เราสร้างมาแสดงเพื่อดูความสัมพันธ์ของแต่ละตาราง รวมไปทั้งสามารถสร้างหรือลบตารางใหม่ได้เช่นกัน

Problem/Solution

  • การใช้งานโปรแกรมนั้นค่อนข้างยุ่งยาก และมีความซับซ้อนพอสมควร ต้องทำการศึกษาการทำงานของส่วนต่างๆรวมไปถึงวิธีการใช้และการประยุกต์ใช้เพิ่มเติม

Decision

  • เหตุผลที่เลือก MySQL สำหรับทำงานเนื่องจากต้องการศึกษาว่ารูปแบบการทำงานนั้น มีความคลอบคลุมกว่า ใช้งานได้ง่ายกว่า XAMPP ที่มี PHPMyAdmin หรือไม่

Related Info/link/reference

  • MySQL Workbench Tutorial : https://www.youtube.com/watch?v=RSHevYMwCVw
  • Download and Install MySQL : https://www.youtube.com/watch?v=WuBcTJnIuzo

วันอาทิตย์ที่ 21 มกราคม พ.ศ. 2561

Week 2

What have you done/learned

  • ทำการออกแบบโปรแกรมคำนวณเกรดเฉลี่ยโดยใช้ภาษา Python ในการอ่านไฟล์ CSV
    ( Comma-Separated Value )
  • ศึกษาเกี่ยวกับการองค์ประกอบของ Database และส่วนประกอบต่างๆของตาราง
  • ทำการสร้างตารางใหม่เพื่อใช้สำหรับการคำนวณค่า GPA


    ภาพตารางบันทึก grade

    Problem/Solution

  • ค่าของเกรดมีการปัดขึ้นหากให้ %.2f จึงจำเป็นต้องใช้ library ตัวอื่นมาช่วย คือ Decimal โดยใช้คำสั่ง


    โค้ดที่ใช้ในการแก้ปัญหาการปัดเลขขึ้น โดยแบ่งคำสั่งออกเป็น Decimal(ค่าที่ใช้.quantize(Decimal('.01) > ตำแหน่งของทศนิยมที่ต้องการ, rounding=ROUND_DOWN)) > ปัดเลขทศนิยมลง
  • การบวกค่าทั้งหมดในตารางหากทำการตัดโดยใช้ช่องว่างระหว่างตารางจะไม่สามารถคิดของบรรทัดสุดท้ายได้ จึงได้เพิ่มฟังค์ชันการนับจำนวนของแถวเพื่อใช้เทียบกับตำแหน่งของแถวปัจจุบัน


    จากภาพจะเป็นการสร้างฟังค์ชันที่อ่านค่าจากชื่อไฟล์ที่เราส่งไปและทำการนับจำนวนของแถวทั้งหมดและส่งกลับไปที่จุดที่เรียก

    Decision

  • ในการคำนวณออกแบบโปรแกรมครั้งนี้ได้ใช้ภาษา Python ในการพัฒนาโดยทำการออกแบบโดยใช้ IDE ที่ชื่อ PyCharm



    ภาพตัวอย่างของ PyCharm

  • ในส่วนของวิธีการคำนวณได้เลือกใช้การแปลงค่าจากเกรดให้เป็นตัวเลขที่ใช้ในการคำนวณแทนการใช้ระดับคะแนนโดยตรงเพื่อทดสอบการออกแบบเงื่อนไขสำหรับใช้คำนวณ


    ภาพตัวอย่างเงื่อนไขที่ใช้ในการคำนวณ

    เนื่องจากการใช้ if else แบบนี้ทำให้ต้องทำการเขียนคำสั่งเดิมซ้ำๆซึ่งไม่เหมาะสมในการทำงาน จึงได้มีการปรับปรุงและแก้ไขเป็นแบบการดึงค่าที่ตรงกับ array ที่กำหนดมาใช้

    Related Info/link/reference

  • การใช้ Library ของ Decimal : https://docs.python.org/2/library/decimal.html
  • การออกแบบฟังค์ชันการนับจำนวนตาราง : https://stackoverflow.com/questions/970983/have-csv-reader-tell-when-it-is-on-the-last-line
  • ตัวอย่างโค้ด
import csv
from decimal import Decimal, ROUND_DOWN

filename = 'GPA_Calculate.csv'
grade = 0
total_grade = 0
credit = 0
total_credit = 0
gpax = 0
grade_list = ['A', 'B+', 'B', 'C+', 'C', 'D+', 'D', 'F']
score_list = [4, 3.5, 3, 2.5, 2, 1.5, 1, 0]


def gpa_calculate(subject):
    for i in range(len(grade_list)):
        if subject[3] == grade_list[i]:
            return Decimal(score_list[i] * float(subject[2]))


with open(filename) as in_file:
    last_line = sum(1 for _ in in_file)
    reader = csv.reader(open(filename))

    for row in reader:
        if row[3] == '':
            gpa = Decimal((grade / credit).quantize(Decimal('.01'), rounding=ROUND_DOWN))
            gpax = Decimal((total_grade / total_credit).quantize(Decimal('.01'), rounding=ROUND_DOWN))
            print(grade, total_grade, credit, total_credit, gpa, gpax)
            grade = 0
            credit = 0

        elif last_line == reader.line_num:
            grade += gpa_calculate(row)
            total_grade += gpa_calculate(row)
            credit += Decimal(row[2])
            total_credit += Decimal(row[2])
            gpa = Decimal((grade / credit).quantize(Decimal('.01'), rounding=ROUND_DOWN))
            gpax = Decimal((total_grade / total_credit).quantize(Decimal('.01'), rounding=ROUND_DOWN))
            print(grade, total_grade, credit, total_credit, gpa, gpax)

        else:
            grade += gpa_calculate(row)
            total_grade += gpa_calculate(row)
            credit += Decimal(row[2])
            total_credit += Decimal(row[2])

Database Project

ผลงานทั้งหมดจากกลุ่มที่ 3 ลิ้งวิดิโออธิบายส่วน ER-Diagram https://www.youtube.com/watch?v=N3VQIO56_kM ลิ้งวิดิโอส่วน web applica...