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

Database System - work 6 Try to insert more transcript data to sqlite more than ram


ขั้นตอนการทดลอง

1 .  กำหนดเลขเริ่มต้น
2 .   loop จำนวนมาก count i
3 .  f_name = sarik_<start + count>  , l_name = kumpan<start + count>
4 .  student id = random<55, 60> + 010126 + start + i
5 .  วิชา แต่ละคนเท่ากัน แต่เกรด เซ็ค ไม่เหมือนกัน ใช้การ random
6 .  เพิ่มไปเรื่อยๆ จนได้ขนาดที่พอใจ
โดย มีตัวอย่างโค้ด ที่ใช้ในการเพิ่มข้อมูล ดังนี้


ปัญหาที่พบและทางแก้

แรมมีขนาดใหญ่ การจะ Insert ให้ .db file มีขนาดมากกว่า ram ต้องใช้เวลานานเกินไป

แก้โดยการใช้ VM มาช่วย เพื่อ ใช้ เครื่องที่มี สเปค หน่วยความจำต่ำๆมาใช้งาน

ใช้ Google Cloud Platform



โดยเลือกมาใน service ของ Computer > computer Engin

และการตั้ง เครื่องนั้นกำหนดได้หลากหลายเช่น


ขนาดหน่วยความจำ จำนวน Core รวมทั้ง OS ซึ่งจะมีผลต่อค่าใช้จ่าย ซึ่งผมมีเงินเหลือ จากกิจกรรมที่เขาแจกให้มา 300 เหรียญ นั้นจึงได้นำมาใช้งาน


เปิดเข้า คอมแมนไลน์ ใน SSH ได้จากในภาพ

จากนั้นหลังจากลง Tools ต่างๆ เช่น python sqlite3 แล้ว ก็ ทำการ clone code มาจาก github 


และทำการเพิ่มขนาดไฟล์จนได้ขนาด ที่ต้องการ เช่น 1.3 GB ( ประมาณ 2x ram )


จากนั้นจึงได้เริ่มทำการทดลอง จับเวลาการ คิวรี่ข้อมูล ต่างๆ ดังนี้



table user 532,330 row ใช้เวลาการ แสดงข้อมูลทั้งหมด 156.828 sec





ต่อมาใน table student_records มีข้อมูล 19,184,513 row แต่ปัญหาคือการ คิวรี่ แสดงข้อมูลทั้งหมด ไม่ทราบว่า เป็นที่ terminal หรือว่า ทาง sqlite เองที่ไม่สามารถแสดง จนครบได้ ซึ่งในภาพจะแสดง ทั้ง 3 ครังที่พยายามแล้วค้าง

จึงได้ เปลี่ยนเป็น การคิวรี่แสดงข้อมูล 2 ล้านแถวแรกแทน



ซึ่งจะใช้เวลา 866.787 วินาที


ซึ่งโดยสรุปแล้ว

ตอนนี้ เท่าที่ลอง ยัง insert ได้อยู่ ในขณะที่ขนาดเกิน 2 เท่าของแรมไปแล้ว
แต่การ คิวรี่นั้น ยังไม่ทราบสามารถ ทีั่ขัดข้อง

ref 

การวัดเวลาคิวรี่


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

Database System - work 5 Try DBMS on other OS, and learn ER diagram

ได้ ไปลอง การใช้งาน MySQL , SQLite

บน Ubuntu ver 16.04 LTS

โดยจะเริ่มจาก SQLite ก่อน ซึ่งวิธีการลงผ่าน Command Line ได้ไปศึกษาผ่าน 
ซึ่งจะเริ่มจากการพิม

- SUDO APT-GET INSTALL  SQLITE3 LIBSQLITE3-DEV 

เพื่อเริ่มกระบวนการติดตั้ง

ซึ่งหลังจากติดตั้งแล้ว ผมก็ได้ทำการ Clone Project จาก GIT HUB 
ได้ผลลัพธ์ดังนี้


โดย อย่างแรกที่ผมจะลองก็คือใช้ โปรแกรมที่ชื่อ 

DB Browser for sqlite เพื่อมาเปิดไฟล์ .DB ที่มีอยู่ก่อนแล้ว

ซึ่งก็จะเห็นรายละเอียดต่างๆ ของ data base file นั้นๆได้ 

ซึ่งหลังจากได้ลองใช้โปรแกรมสำหรับช่วยเปิดไฟล์ .db แล้ว ต่อมาผมจึงได้ลองใช้

การเรียกดูข้อมูลผ่าน command line ดูบ้าง ดังนี้



ก็พบว่า Sqlite 3 ทำงานได้ตามปกติ ดี ถือว่าติดตั้งเสร็จและใช้งานได้

ต่อมาจะลองใช้งาน code ที่ได้ใช้งานกับ window ดูบ้าง ก่อนหน้านั้นจะทำการอัพเดท python เป็น version 3.4 ก่อน และจึงรันตามภาพ


ทำการสร้าง ฐานข้อมูลขึ้นมา และมี ตารางเกี่ยวกับ grade และรายชื่อ นักศึกษาด้านใน

ไฟล์ผลลัพธ์


ทำการเพิ่มข้อมูลเข้าฐานข้อมูล



ทำการดูข้อมูลที่ถูกเพิ่มเข้าไปในฐานข้อมูล นั้น

ต่อมาจึงได้ ลอง MySQL ต่อโดยต้องทำการติดตั้งโดย ทำตามดังนี้


ทำการติดตั้งโดยการพิม 

Sudo apt-get install mysql-server


โดยในระหว่างที่ทำการติดตั้งจะมีการให้กรอก รหัส ของ root user ด้วย


หลังจากทำการติดตั้งก็ทำการตรวจสอบเวอร์ชั่นของ mysql



ทำการตั้งค่าความปลอดภัยต่างๆ หลังการติดตั้งครั้งแรกเสร็จ 


ทดสอบการทำงานของ mysql server ( active )


ทำการเข้า mysql ผ่าน root user โดยการพิม 

mysql -u <user or root> -p 

และจะมีการให้กรอก รหัส ด้วย



เนื่องจากไม่ควรใช้ root user จึ้งจะทำการสร้าง user ขึ้นมาใหม่โดยใช้คำสั่งดังภาพ เพื่อสร้าง user ใหม่ขึ้นมา


ทำการกำหนดสิทธิ์ ต่างๆ ของ user ใดๆ ( ดังภาพคือใช้ คำสั่ง mysql ได้ทั้งหมด )


ทำการ login เข้า mysql โดยใช้ user sarik หรือ user ทีสร้างขึ้นมาเองใหม่


สุดท้ายแล้วใน Ubuntu version นี้ ก็ สามารถ ลงและใช้งาน MySQL, SQLite ได้ตามปกติ ไม่พบปัญหาใดๆ ยกเว้นเรื่องโค้ด ที่จำเป็นต้องใช้ version ที่ตรงกับที่เขียนไว้ใน window คือ 3.4 ซึ่งก็ไม่ใช่ปัญหาทางด้าน DBMS เอง


------------------

และได้ทำการศึกษา ER diagram ซึ่ง

Entity - สิ่งต่างๆ ที่มีการคงอยู่แบบอิศระ ต่อกัน
Weak Entity - สิ่งที่มีอยู่ แต่ จะขาด Entity หลักไม่ได้ ต้องใช้ attribute จาก Entity อื่นด้วย
Attribute - คุณสมบัติ ต่างๆ
key Attribute - คุณสมบัติ เด่นๆ ใช้ในการระบุได้
Multi valued Attribute - คุณสมบัติที่เก็บค่าได้หลายค่า
Derived Attribute - คุณสมบัติที่สืบทอดมา
Relationship - เป็นความสัมพันธ์ ระหว่าง Entity
Identifying Relationship - ความสัมพันธ์ ที่เป็นเป็นตัวอ้างถึง attribute จาก entity อื่น ที่นำมากำหนดร่วมเป็น key 


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

Database System - work 4 try SQLite , Insert team csv to db

โหลด SQLite
https://www.sqlite.org/

ทำตาม Tutorial
http://www.sqlitetutorial.net/sqlite-sample-database/

SQLite มี ชนิดของ ข้อมูลที่แตกต่างจาก MySQL อยู่มาก
http://www.sqlitetutorial.net/sqlite-data-types/
ซึ่งจะมี 5 ชนิดหลักๆ ดังนี้

NULL
INTEGER
REAL
TEXT
BLOB

โดยจะมีการทำงานที่แตกต่างกัน

NULL values mean missing information or unknown.

Integer values are whole numbers (either positive or negative). An integer can have variable sizes such as 1, 2,3, 4, or 8 bytes.

Real values are real numbers with decimal values that use 8-byte floats.

TEXT is used to store character data. The maximum length of TEXT is unlimited. SQLite supports various character encodings.

BLOB stands for a binary large object that can be used to store any kind of data. The maximum size of BLOBs is unlimited.

SQLite กำหนด User ไม่ได้ ทำให้ใช้งานแบบ Multi-user ได้ไม่ดี

SQLite จะสร้างไฟล์ .db ออกมาในทันที