วันจันทร์ที่ 2 เมษายน พ.ศ. 2561

wk12 : form

First form
จาก table employee
จะเห็นว่า มี Jon และ Lester มี 2 เบอร์
จึงไม่เป็น 1st form จากกฏคือ “each attribute of a table must have atomic (single) values”
จึงต้องทำให้ตารางเป็นดังนี้
(แยกเบอร์ออกมา)

Second form
มีกฏดังนี้
  • table จะต้องเป็น first form ก่อน
  • ต้องไม่มี non-prime attribute ที่ขึ้นอยู่กับ subsets of candidate key ของ table
non-prime attribute คือ attribute ที่ไม่ใช่ candidate keys

ยกตัวอย่าง ครูสอนวิชา
จากตัวอย่างจะเห็นว่า teacher_age ขึ้นอยู่กับ teacher_id (เป็น candidate keys) เพียงตัวเดียว

ดังนั้น ต้องแยกตารางเป็นดังนี้ 


Third form

  • Table จะต้องเป็น 2NF
  • ต้องไม่มี Transitive functional dependency ของ non-prime attribute บน super key ใดๆ
จากตารางจะเห็นว่า emp_zip ขึ้นอยู่กับ emp_id
และ emp_state,emp_city,_emp_distirict ขึ้นอยู่กับ emp_zip
จึงเกิด Transitive functional dependency (emp_zip เป็น non-prime attribute)

ทำการแยกตารางเพื่อไม่ให้เกิด Transitive functional dependency



ref: https://beginnersbook.com/2015/05/normalization-in-dbms/


วันเสาร์ที่ 24 มีนาคม พ.ศ. 2561

wk11 : guideline4

Guideline 4

  • ออกแบบให้ relation schema ที่มีการ equally join (เลือกจาก attributes ที่เหมาะสม) จะทำให้ไม่เกิด spurious table (เกิดจากการ join โดยไม่ใช้ primary key หรือ foriegn key อ้างอิงจาก quora
  • เลี่ยงการใช้ attributes ที่ไม่ใช่ pk หรือ fk มาใช้ join

wk8 : database performance

ใช้การวัดเวลาในการ import ข้อมูล และการ Query ทั้ง 3 แบบ
1.Query 1 - รายชื่อนักศึกษาที่ชื่อขึ้นต้นด้วยตัว j, f, k
2.Query 2 - นักศึกษาที่ไม่ได้เกรด A ในวิชา PROGRAMMING FUNDAMENTAL
3.Query 3 - อันดับวิชาที่มีจำนวนนักศึกษาได้เกรด A มากที่สุด

DBMS ที่ใช้งาน : 
MySQL (python library)
Postgresql (python library)
SQLite ทำการติดตั้งทั้งตัว dbms และ library

ข้อมูลที่ใช้ import
subject
student
registration

เมื่อโหลดไฟล์ student ไปแล้วต้องลบบรรทัดแรกที่เขียนว่า >>>student<<< ออกไปด้วย (ใช้ Notepad++ จะเห็นเรียงเป็นบรรทัด)

จากนั้นทำการรันโค้ด python ที่ใช้วัดเวลาในการ import , query ข้อมูล
Google Drive

เมื่อลองรันแล้วนำข้อมูลมาใส่ตารางได้ดังนี้

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

wk6 : ทดลองนำไฟล์ขนาดใหญ่เข้า database

 What I have done

ทดลองสร้างไฟล์ขนาดใหญ่เพิ่มขึ้นเรื่อยๆ ดังตาราง 
จากนั้นทำการ import เข้า MySQL โดยใช้ python (library อยู่ใน Link)
แล้วใช้การ Query แบบ ทั้งหมด ( select * )

QUERY ALL
FETCH TIME (second)
1000 rows (0.28 MB)
0.031
9202 rows (1.93 MB)
0.016
12113 rows (2.18 MB)
0.157
20058 rows (4.54 MB)
1.453
550113 rows (78.71 MB)
1.828
3,622,113 rows (487.23 MB)
9.938
5,179,927 rows (733.53 MB)
15.984
16,084,625 rows (2271.03 MB)
54.125

Problem

หากใช้การ insert โดยใช้ loop ใน python เรื่อยๆจะใช้เวลานานมากๆ จึงใช้วิธี import ไฟล์ (csv file) แทน

Link in use

wk5 : Find ER from textbook

What I have done

หา ER Diagram จาก Textbook ที่ชื่อ Database Concept 6th Edition 
จากนั้นนำมาวาดใน Google Presentation


What I have learn


เส้นสองเส้นหมายถึงความสัมพันธ์แบบ Total participation หมายถึง สิ่งๆนึงต้องมีส่วมรวมในสิ่งอีกสิ่งแบบทุกตัว เช่น นักเรียนทุกคนอยู่ในdepartment

Weak entity คือ entity ที่ไม่มี primary key ของตัวเอง และขึ้นอยู่กับ owner (strong entity) เช่น
Course ที่เป็น Owner (เจ้าของ) ของ Section

Relation R สามารถมีตัวแปรเพื่มได้เช่น takes มีตัวแปร grade








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

w4 : import team's csv to database

import team csv to database

What I have done & learn
  • สร้างตารางแยกไว้ 3 ตาราง
    • student (เลขประจำตัว ชื่อ นามสกุล คณะ สาขา)
    • subject (รหัสวิชา ชื่อวิชา หน่วยกิต)
    • registration
  • ทำการ import ข้อมูลทั้ง 3 ตาราง โดยใช้ปุ่ม import ภายในตาราง
  • ทดลองการหาชื่อนักศึกษาจากตารางใน Registration
    • โดยใช้คำสั่ง Join


Problem & Decision
  • พบ Error 1452 เนื่องจากตารางที่มีความเกี่ยวข้องกัน มีข้อมูลไม่ครบเท่ากัน 
    • เช่น ในตารางวิชาเรียน กับ ในตารางลงทะเบียน
    • ในตารางลงทะเบียนมีวิชา ที่ไม่มีในตารางวิชาเรียน จะเกิด Error นี้
    • ทางแก้คือ เพื่มวิชาในตารางวิชาเรียน
  • จะทำการลบข้อมูลที่มี Foreignkey เชื่อมกันอยู่ ไม่สามารถทำได้

Reference
  1. https://stackoverflow.com/questions/1253459/mysql-error-1452-cannot-add-or-update-a-child-row-a-foreign-key-constraint-fa
  2. https://www.w3schools.com/sql/sql_join.asp
  3. https://dev.mysql.com/doc/workbench/en/wb-forward-engineering-sql-scripts.html

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

w3

ทำ tutorial SQL ใน w3school
และ Import CSV to DBMS

What I have done & learn
  • ได้รู้คำสั่งของ SQL เบื้องต้น เช่น
    • select
    • distinct
    • where
    • and or not
    • insert into
    • update
  • ได้รู้คำสั่งเบื้องต้นในการนำข้อมูลจากไฟล์ csv เข้า dbms (MySQL)
    • ได้รู้ว่ามีปุ่ม Import จากไฟล์ ใน MySQL Workbench
    • ได้รู้คำสั่งการ
      • สร้าง table ( บรรทัดที่ 3-9 )
      • ลบ table ( บรรทัดที่ 1)
      •  import จาก ref2 ( บรรทัดที่ 12-17 )

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
DROP TABLE MyScore;

CREATE TABLE MyScore(
Term varchar(255),
Subject varchar(255),
Credit int,
Grade varchar(255),
ID int NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
);

LOAD DATA LOCAL INFILE  'C:/Users/NTP/Desktop/database/_CSV SpreadSheet for DBMS.csv'
INTO TABLE MyScore
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
Problem & Decision
  • ไม่สามารถกด Import จากไฟล์ csv ได้
    • ไม่มี Primary Key ใน table จึงต้องเพิ่ม primary key

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

    w2 : ลองใช้งาน DBMS


    ลองใช้งาน DBMS

    What I have done & learn

    DBMS คืออะไร
    DBMS คือ ระบบการจัดการฐานข้อมูล หรือซอฟต์แวร์ที่ดูแลจัดการเกี่ยวกับฐานข้อมูล โดยอำนวยความสะดวกให้แก่ผู้ใช้ทั้งในด้านการสร้าง การปรับปรุงแก้ไข


    ติดตั้ง MySQL Community
    สร้าง connection ชื่อว่า localhost
    ทำการโหลด Sample เข้ามาใน Database โดยการกด File > โหลดสคริป > เลือกไฟล์ที่โหลดจากเว็บ แล้วกดปุ่มรูปสายฟ้า (สีเหลือง)

    ใช้คำสั่ง SELECT โดยให้แสดงแค่ column (attribtues) ที่ต้องการคือ lastname ,firstname ,jobtitle จากตาราง employee


    ลองใช้คำสั่ง SELECT เพื่อเรียกข้อมูลของ employees มาแสดงทุก column (ใช้เครื่องหมาย * )



    การ Query แบบเรียงตาม lastname

    การ Query เรียงตาม lastname แบบไม่เอาตัวซ้ำ




    • ได้เรียนรู้การใช้คำสั่ง Query แบบเบื้องต้น เช่น SELECT
      • สามารถใช้ Distinct เพื่อหาอันที่ไม่ซ้ำ
      • สามารถเรียงลำดับโดยเพิ่มคำสั่ง ORDER BY ตามด้วย attributes 



    Problem & Decision

      • เมื่อเข้าโปรแกรม MySQLWorkBench เจอกับข้อความว่า There is no connection to the MySQL Server
        • เลือก startup/shutdown ที่แท็บ instance แล้วกด start server

      Reference
      1. http://www.mysqltutorial.org/basic-mysql-tutorial.aspx
      2. http://www.mindphp.com/

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

      w2 : calGPA in Python

      CALGPA in Python


      What I have done & learn

      • ทำการ Export file CSV จาก Spreadsheet 
      • ได้หาวิธีการอ่านไฟล์ csv 
      • ทำการเขียนโค้ดเพื่ออ่านไฟล์ csv แล้วทำการคิดเกรด
      • 
        
      import csv
      
      def main():
          semester = []
          sem_index = -1
          grade , credit = 0,0
          grade_to_num = { 'A':4, 'B+':3.5 , 'B':3 , 'C+':2.5, 'C':2, 'D+':1.5, 'D':1, 'F':0}
          with open('csvgrade.csv', 'r') as f:
              reader = csv.reader(f)
              for row in reader:
                  if row[1] != '':
                      grade += int(row[1]) * grade_to_num[row[2]]
                      credit += int(row[1])
                      semester[sem_index] = round(grade/credit,2)
                  else:
                      semester.append(0)
                      grade = 0
                      credit = 0
                      sem_index += 1
          print("GPA > ",semester)
          print("GPAX > ",sum(semester)/len(semester))
      
      main()
      
      https://pastebin.com/9dTmrUPD


      ผลลัพท์จากการรันโค้ด




      Problem & Decision

      Reference
      1. http://www.pythonforbeginners.com/systems-programming/using-the-csv-module-in-python



      วันพุธที่ 10 มกราคม พ.ศ. 2561

      w1 : spreadsheet calculate GPA

      Enter your grades/transcript in a spreadsheet
      then calculate your GPA


      What I have done & learn

      • สร้าง Spreadsheet
      • ทำการสร้าง custom function ใน spreadsheet เพื่อนำข้อมูลเกรดไปคำนวณหา GPA
      •  1
         2
         3
         4
         5
         6
         7
         8
         9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        function calGPA(weight_column,grade_column){
          var grade_to_int = { 'A':4, 'B+':3.5 , 'B':3 , 'C+':2.5, 'C':2, 'D+':1.5, 'D':1, 'F':0}
          var gpa = 0
          var totalweight = 0
          for (var i = 0 ; i < weight_column.length ; i++){
            if (check_valid_cell(grade_column[i][0]) && check_valid_cell(weight_column[i][0])) {
              var grade = grade_to_int[grade_column[i][0]]
              var weight = weight_column[i][0]
              gpa += weight*grade
              totalweight += weight
            }
          }
          gpa = gpa/totalweight
          return gpa
        }
        
        function check_valid_cell(input){
          if (input == ""  || input == "เกรด" || input == "หน่วยกิต"){
              return false;
          } else { 
              return true; 
          }
        }
        
      • เรียกใช้ฟังก์ชั่นโดยพิมพ์ =round(calGPA(B3:B37,C3:C37),2) ใน Cell ใดๆ โดยที่ B3:B37 เป็น column ของ หน่วยกิต และ C3:C37 เป็น column ของ เกรด
        • ฟังก์ชั่น round เป็นการปัดเศษทศนิยมลงให้เหลือ 2 ตำแหน่ง
      • หากส่งค่าที่เป็น column มาในฟังก์ชั่น (เช่น C3 ถึง C37 ) จะถูกมองเป็น Array 2 มิติ เช่น a[x][y] โดยที่ x คือเลขแถว และ y คือ column


      Problem & Decision
      • จะเปลี่ยนเกรดที่เป็นตัวหนังสือ (A, B+, B,...) ให้เป็นตัวเลข (4, 3.5, 3,...)ยังไงดี
        • หาวิธีสร้าง custom function ใน spreadsheet ของ google (ref 1)
      • รับข้อมูลทั้ง column มาใช้ใน custom function ยังไง
        • หาวิธีนำข้อมูลมาใช้ (ref 5) พบว่าค่า colum (เช่น C3:C37 , B3:B37) ถูกส่งเข้ามาเป็น Array 2 มิติ
      • สร้าง Dictionary เพื่อแปลงเกรดที่เป็นตัวหนังสือ (A,B+,B,...) เป็นตัวเลขใน Javascript ยังไง
        • (ref 3)

      wk12 : form

      First form จาก table employee จะเห็นว่า มี Jon และ Lester มี 2 เบอร์ จึงไม่เป็น 1st form จากกฏคือ  “each attribute of a table must ha...