วันอาทิตย์ที่ 12 กรกฎาคม พ.ศ. 2558

ลอง NoSQL ง่ายๆ กับ IBM Cloudant (มีสาระ)

สวัสดีครับ ก็กลับมาอีกแล้วกับ Blog สาระเน้นๆ รอบนี้จะนำเสนอในท้องเรื่อง ลอง NoSQL ง่ายๆ กับ IBM Cloudant ติดตามรับชมได้เลยครับ

เรื่องของเรื่องมันมีอยู่ว่า เมื่อวันที่ 13-14 มิถุนายน 2558 ที่ผ่านมาได้มีโอกาศมีเข้างาน AngelHack Bangkok 2015 พอดีในงานมี Engineer จาก IBM มาแนะนำ Cloud ของ IBM ที่ชื่อว่า IBM Bluemix จากที่ฟังมาก็เข้าใจได้ทันทีเลยว่า IBM ตั้งใจทำโปรดักตัวนี้มาก ตอนที่เค้า Mini Workshop ให้ ก็พบว่าระบบเค้าก็เข้าใจได้ง่ายดี แล้วตัว Platform ก็สมบูรณ์ในระดับที่ใช้งานได้เต็มรูปแบบเลยทีเดียว




Bluemix คืออะไร

Bluemix ก็คือ Cloud Platform ตัวหนึ่งของ IBM ที่มีทั้งส่วนที่เป็น IaaS, PaaS และ SaaS ลักษณะเดียวกับ AWS: Amazon Web Service ของ Amazon หรือ Azure ของ Microsoft นั่นเอง แต่อาจจะยังเทียบกับเจ้าตลาดในตอนนี้ไม่ได้ เพราะว่าตัว Server พึ่งมีแค่ 2 โซน คือ อเมริกาและยุโรป (เราอยู่เอเซียก็มองตาปริบๆ ไกลเกิน) เอาน่า ไม่เป็นไร เดี๋ยวเค้าก็ต้องขยายมาเอง ไม่งั้นไม่มีคนใช้แน่นอน

ทีนี้เราจะโพกัสไปที่ IBM Cloudant ตัวเดียวก่อน เพราะว่าตัวอื่นยังไม่ได้ลองอะไรมาก ก็ต้องบอกเหตุผลก่อนว่าทำไมถึงเจาะจงที่จะใช้ Cloudant ก่อนนะ

ก็พอดีว่า ตอนนี้เทรนเรื่อง Big Data เนี่ยมาแล้ว แล้วพวก SQL ที่ใช้กันอยู่ทุกวันนี้ Performance มันไม่ไหวกับข้อมูลขนาดนั้น เค้าก็เลยคิดค้น NoSQL ขึ้นมา โดยเน้นไปที่เรื่อง Performance กับ Unstructured Data แล้ว.......... เอาไงล่ะทีนี้ ก็ตอนใช้ SQL เราก็จะคุ้นๆกับคำสั่ง SELECT FROM WHERE แล้วถ้าเป็น NoSQL ล่ะมันเป็นยังไง




NoSQL VS SQL

เรามาดูคำจำกัดความของ NoSQL กันก่อน
NoSQL นั้น คือ Not Only SQL มันหมายถึงเมื่อเราทำการออกแบบระบบใดๆ ขึ้นมาก็ตาม ให้จำไว้ว่า รูปแบบการจัดเก็บข้อมูลนั้นมีมากกว่าหนึ่งแบบ ดังนั้น ต้องเลือกวิธีการให้เหมาะสมกับความต้องการ
ขอยกข้อความนี้มาจาก http://www.somkiat.cc/note-overview-nosql-database/

ก็คือ NoSQL ถูกออกแบบมาเพื่อ เก็บข้อมูลที่มีรูปแบบหลากหลาย และปริมาณมาก เพื่อให้เราโฟกัสไปที่การสนใจว่าจะเก็บข้อมูลอะไรดี มากกว่าจะเสียเวลาโฟกัสตรงที่ว่า เราควรจะเก็บข้อมูลอย่างไรดี ถ้าจะเอาให้ชัดๆก็คือ ถ้าเราพูดเรื่อง NoSQL vs SQL ก็หมายถึง Schema-less vs Schema นั่นเอง ..... อย่าพึ่งงงนะ

ทีนี้ในการนำไปใช้งาน เจ้า NoSQL นี่ก็มีคนทำหลายเจ้ามาก ที่ดังๆก็คือ MongoDB, Hadoop และอีกหลายๆตัว




Schema-less !== NonType

อันนี้ไม่ขออธิบายนะครับ น่าจะเข้าใจกันดี
ถึงแม้ว่าโครงสร้างการเก็บข้อมูลของ NoSQL จะไม่ใช้เรื่องสำคัญ แต่กับเรื่องชนิดมันสำคัญนะ

ชนิดการเก็บข้อมูลของ NoSQL มันก็มีเป็นแบบหลักๆอยู่ตามนี้


  • Column
  • Document
  • Key-value
  • Graph
  • Multi-model

เอาละ เกริ่นมาระดับนี้แล้วก็น่าจะพอมองออกละนะว่า NoSQL มันเป็นยังไง (มาถึงตรงนี้ถ้าไม่เข้าใจ ก็บังคับเข้าใจนะ!) กลับมาเข้าเรื่องหลักดีกว่า





ลอง NoSQL ง่ายๆ กับ IBM Cloudant

IBM Cloudant
เจ้า Cloudant เนี่ยมันเก็บข้อมูลในลักษณะ Document ถ้าถามว่าการเก็บข้อมูลในลักษณะ Document มันเป็นยังไง ก็ให้นึกถึง JSON อ่ะ แบบนั้นแหละ

แล้วทำไมต้อง Cloudant ล่ะ ก็มันฟรีระดับหนึ่งครับ แถมยังไม่ต้องเซ็ทอะไรให้วุ่นวายด้วยนะ


Let's Play

ต่อไปนี้จะเป็น How To แบบง่ายๆนะ

สิ่งที่ต้องเตรียม


  • JAVA SDK
  • Eclipse
  • IBM Bluemix Account
  • Cloudant libs
  • ความพยายาม
  • ความตั้งใจ



ขั้นแรก

ก็เตรียมตัว จัดการ Eclipse ให้รัน Java ได้ ก็เป็นอันจบ


ขั้นสอง

โหลด Cloudant libs มาซะ เอาเอาไปใส่ใน Project บน Eclipse จะด้วยวิธีการใดก็แล้วแต่ เอาให้ใช้ได้ก็แล้วกัน


ขั้นสาม

ติต่างว่ามี IBM Bluemix Account แล้วนะ ถ้าไม่มีก็สมัครนะ ฟรี

เข้าไปที่ Dashboard ของ Bluemix นะ แล้ว แล้วสังเกตุที่เมนูด้านบน จะเห็นคำว่า CATALOG คลิ๊กเข้าไปเลย


จากนั้นก็จะมีทั้ง Service ทั้ง Application ขึ้นมาให้เลือก อันนี้ให้เราหา หัวข้อ Data Management แล้วเลือก Cloudant NoSQL DB


จากนั้นเราจะต้องตั้งชื่อให้กับ Service นะ ก็ตั้งไป เสร็จแล้วก็กด CREATE แล้วรอแปปนึง


พอระบบสร้าง Service เสร็จ ระบบจะพาเราไปที่ Dashboard ของ Cloudant ให้เราสังเกตุที่เมนูด้านบนจะมีช่องให้สร้าง Database ใหม่ได้ ในที่นี้ให้ใส่ ว่า Test ก่อนนะ จะได้ตรงกัน


รอแปปนึง ระบบจะสร้าง Database เสร็จ ให้คลิ๊กที่ชื่อ Database ที่พึ่งสร้าง แล้วไปที่หัวข้อ Permission เพื่อที่เราจะได้สร้าง Key ให้ใช้ตัว Database ผ่าน API ได้


ก็ให้ Gen Key ขึ้นมานะ ตรงนี้อย่าลืมจดเอาไวนะ เพราะมันจะแสดง password แค่ตรงนี้ ถ้าเรา refresh หน้านี้ มันจะไม่แสดง password แล้ว ในภาพคือตัวอย่างเวลาที่แสดง password พอได้ password แล้วอย่าลืม เปิดสิทธิ์ด้วยล่ะ


ต่อมาให้เข้าไปที่หน้า ACCOUNT ทางเมนูด้านซ้าย จด Account Name มานะ ต้องใช้


ทีนี้ทางฝั่ง Server ก็พร้อมแล้ว ต่อมาเรามาต่อกันที่ฝั่ง Client ก็สร้างโปรเจ็คขึ้นมา 1 โปรเจ็คนะ เป็น Java Console ธรรมดานี่แหละ จัดการ Import Libs ให้พร้อมแล้วก็มาลองกันเลย

ก็เหมือนกับการใช้งานพวก Database ตามปกติ ก็คือสร้าง Connection ขึ้นมา
CloudantClient client = new CloudantClient(API.CLOUDANT_ACCOUNT,API.CLOUDANT_KEY,API.CLOUDANT_PASSWORD);
System.out.println("Connected to Cloudant");
System.out.println("Server Version: " + client.serverVersion());
สังเกตุ Constructor CloudantClient() ที่รับพารามิเตอร์ 3 ตัว ตัวที่หนึ่ง คือ Account ที่เราได้มาจาก Account Name ส่วนตัวที่สองคือ Key ที่เราได้มาจากการ Generate และตัวที่สามคือ Password ที่ได้มาจากการ Generate เช่นกัน

ถ้าโค้ดที่รันผ่าน น่าจะแสดงผลแบบนี้ได้
Connected to Cloudant
Server Version: 1.0.2


เอาละ ต่อมาเราจะลอง Insert ข้อมูลเข้าไปใน Database กันนะ
ขั้นแรกให้สร้าง Class ขึ้นมาซัก 1 Class แล้วให้มี Attribute ซัก 2 ตัว เอาเป็นตามนี้นะ
public class Person{
private String firstname;
private String lastname;
        // set/get
}


แล้วกลับไปที่ โค้ดชุดแรก แล้วสร้าง Person Instance ขึ้นมา
Person person= new Person();
person.setFirstname("Bill");
person.setLastname("Jobs");


ต่อมา ก็สั่งให้ client ติดต่อกับ Database ที่เราสร้างไว้ ผ่าน Method database()
Database db = client.database(API.CLOUDANT_DATABASE_NAME, false);


Method database() จะรับพารามิเตอร์ 2 ตัว ตัวแรกคือชื่อ Database ที่เราสร้างไว้ ก็ใส่ไปนะ ส่วนตัวที่สอง อย่างพึ่งสนใจ ใส่ False ไปก่อน
ตรงนี้ Method database() จะคืน Database Instance กลับมาให้ ต่อไปเวลาเราจะทำอะไรกับ Database นี้ก็ใช้งานผ่าน Instance ตัวนี้ได้เลย

ขั้นต่อมา เราจะลองใส่ข้อมูลไปใน Database จริงๆแล้วนะ ด้วยคำสั่ง
Response lastInserted = db.save(person);


ตรงนี้เราเรียก Method save() ผ่าน Database Instance แล้ว Method save จะคืน Response Instance มาให้ ซึ่งจะมี ID ของข้อมูลที่เราสั่ง save ไป ให้เราเก็บตัว ID นี้ไว้
ตรงนี้หลังจากที่เราสั่ง save ไปแล้ว ถ้าเรากลับไปดูใน Dashboard เราก็จะเห็นข้อมูลนี้ไปปรากฎอยู่ด้วย

ต่อมาเราจะลองเรียก ข้อมูลที่เราพึ่งจะบันทึกไปด้วย Method find()
Person p = db.find(Person.class, lastInserted.getId());


บรรทัดแรก เราใช้ Method find() โดยกำหนด Class Person ที่เราสร้างขึ้น เพื่อให้แปลงข้อมูลมาเป็น Class Person ให้อัตโนมัติ แบบนี้เวลาเอาไปใช้ต่อก็จะสะดวกหน่อย แต่ถ้าเราไม่ใส่ Class ไป มันจะตอบกลับมาเป็น InputStream นะ ก็เอาไปทำอะไรต่อกันเอง






เย่ เห็นมั้ย ไม่ยากเลย

ก็จบแล้วสำหรับ Blog นี้ จะเห็นได้ว่าไม่ยากเลย NoSQL เนี่ย แต่ยังไงก็อย่าลืมว่า ไอ้ที่อยู่ใน Blog นี่เนี่ย มันแค่ระดับ Starter เท่านั้น จริงๆแล้วยังมีอะไรให้เล่นอีกมากมาย อย่างที่ยกมาเขียนนี่คือในส่วนที่ใช้งานผ่าน Lib ของ JAVA แต่ถ้าจะทำผ่าน PHP ก็จะต้องใช้ผ่าน curl แทน ก็ถือว่าการใช้งานก็ยืดหยุ่นและง่ายพอสมควรดี แต่จะอย่างไนก็แล้วแต่ ยังก็ต้องฝึกฝน ฝึกใช้กันต่อไป อย่าหวั่นไหว แม้วันที่ไม่เป็นใจ

และที่สำคัญคือ



สวัสดี




อ้างอิง
http://www.somkiat.cc/note-overview-nosql-database/
https://console.ng.bluemix.net/home/
https://docs.cloudant.com/libraries.html#java
https://github.com/cloudant/java-cloudant
http://nuuneoi.com/blog/blog.php?read_id=831

ไม่มีความคิดเห็น: