Basic Database System Part 1 - Database , Database model , DBMS คืออะไร

Basic Database System Part 1 - Database , Database model , DBMS คืออะไร

เกริ่นก่อนเข้าเรื่อง

ก่อนจะเริ่มอ่านสิ่งที่ผมเขียนในตอนนี้และตอนต่อๆไป ผมอยากออกตัวก่อนเลยว่าสิ่งที่ผมเขียนอาจจะไม่ถูกต้อง 100% ตามทฤษฎี เพราะผมก็ไม่ใช่อาจารย์ที่สอนวิชานี้โดยตรง (ผมเป็นแค่โปรแกรมเมอร์ธรรมดา) แต่สิ่งที่ผมสอนผมอ้างอิงจากหนังสือกับความรู้ที่เคยเรียนกับอาจารย์ตั้งแต่อยู่สมัยปี 3 แต่ความรู้ที่อาจารย์สอนตอนนั้นเป็นความรู้ที่สามารถเอามาใช้ได้ถึงปัจจุบัน

ส่วนทำไมถึงมาเขียนหัวข้อนี้คือผมอยากจะใช้มันสอนเด็กที่เรียนคอมพิวเตอร์ที่จะต้องมาทำงานด้วยและเป็นแหล่งความรู้ให้กับคนที่อยากเรียนรู้เกี่ยวกับ Database ได้มาเรียนรู้ ผมเห็นคอร์สสอนบางคอร์สมีราคาหลายพันบาทเด็กหรือคนหลายๆคนอาจจะไม่มีเงินพอไปซื้อคอร์สเรียน ผมก็เลยคิดว่าทำเนื้อหานี้ขึ้นมาน่าจะมีประโยชน์กับคนเหล่านี้

Database คืออะไร

ถ้าพูดถึงนิยาม Database นี่ยากเลยครับ แต่ถ้าตามหนังสือที่ผมอ่าน Database นั้นคือที่ที่เก็บข้อมูล โดยข้อมูลที่เก็บนั้นจะเป็นความจริง ความจริงในที่นี้หมายถึงสิ่งที่เราคิดว่ามันจริง เช่น เราเก็บข้อมูลวันเกิดของ User ที่กรอก เราไม่รู้ว่ามันจริงแบบจริงไหม แต่ถ้าเก็บลง Database เราเชื่อว่าจริง ( กรอกข้อมูลผิดมาเราก็เชื่อว่าจริง App แปลงค่าผิดเราก็คิดว่ามันจริง ) ถามว่าทำไมต้องเก็บแต่ความจริง คือถ้าเราเก็บเรื่องไม่จริงเนี่ยมันจะเก็บได้ไม่มีวันหมดครับ เช่น ถ้าเราเก็บเรื่องไม่จริงของวันเกิดผมเนี่ย คุณจะสามารถใส่ตั้งแต่ 1 January 1970 ไปจนจักรวาลแตกดับได้เลยซึ่งแน่นอนว่ามันไม่มีทางเก็บได้และที่สำคัญจะเก็บไปทำไม

เมื่อเราเก็บข้อมูลแล้ว คำถามคือเราจะให้ข้อมูลนั้นแสดงให้เราเห็นแบบไหนและเราจะใช้งานมันและปรับเปลี่ยนแก้ไขมันยังไง ลองนึกภาพตามนะครับ ถ้าคุณบอกคุณเก็บข้อมูลวันเกิดผมไว้คำถามคือ ตอนที่คุณเรียกมันมาดูมันจะแสดงเป็นแบบไหน เป็นกราฟ เป็น text ยาวๆ เป็นไฟล์ คราวนี้ถ้าอยากแก้ไขข้อมูลวันเกิดผมคุณจะแก้มันยังไง แก้ตรงไหน หากคุณคิดตามคุณจะเห็นสิ่งที่เกี่ยวข้องกับ Database อย่างแรกคือ 1. เราเห็นข้อมูลยังไง หน้าตาแบบไหน ภาษาทางเทคนิคจะเรียกมันว่า Database model 2. เวลาเราจะจัดการกับ Database เราจะสั่งมันยังไงหรือเรียกง่ายๆว่าภาษาในการคุยกับ Database 3. กฏของ Database model นั้น แต่อธิบายจะเข้าใจยากดูเอาในตัวอย่างดีกว่าครับ

เรามายกตัวอย่าง Database ที่มี Database model ชนิดต่างๆกัน

  1. Hierarchy database

    ภาพจาก theintactone.com

    Database ประเภทนี้จะแสดงข้อมูลเป็นแบบลำดับชั้น อย่างตัวอย่างในภาพเนี่ยจะมีชั้น College ซึ่ง College ก็จะเก็บข้อมูลของ Department ตัว Department ก็จะเก็บข้อมูล Course , Teacher , Students ซ้อนไปเป็นลำดับชั้น เวลาจะหาข้อมูลก็ต้องเข้าไปหาผ่านแต่ละชั้นลงไปเช่น ถ้าอยากจะหาข้อมูล Students ก็ต้องไล่หาจาก College -> Department -> Students ส่วนภาษาที่ใช้กับ Hierarchy database จะเป็นการสั่ง traverse ไปหาข้อมูลตามชั้น ส่วนกฏของ Database model นี้คือ ตัวชั้นลูกจะไม่สามารถมาเป็นชั้นพ่อของชั้นที่อยู่เหนือกว่าได้ตัวอย่างเช่น ชั้น Students จะไม่สามารถมาเป็นพ่อของชั้น Department ได้

  1. Graph Database

    ภาพจาก neo4j.com

    Database ประเภทนี้จะแสดงข้อมูลให้เราเห็นเป็น Graph ซึ่งก็คือจะมี Node ซึ่งจะมี Attribute ต่างๆ แล้วแต่ละ Node สัมพันธ์กันยังไงดูได้จากภาพที่มี Node ที่เป็น Person : Dan , Person : Ann , Car : Volvo มีความสัมพันธ์ Loves กัน คราวนี้ถ้าต้องการหาข้อมูลเช่น อยากหาว่า Person : Dan เนี่ยมีความสัมพันธ์แบบ Loves กับ Node ไหน เราก็มีภาษาในการเข้าถึงข้อมูลประมาณภาพด้านล่างซึ่งเป็นภาษาชื่อ Cypher (โดยหากท่านใดสนใจลงรายละเอียดเกี่ยวกับภาษานี้สามารถกด Link นี้เพื่อไปดูรายละเอียดเพิ่มเติม )

    ภาพจาก neo4j.com

    กฎของ Database model นี้คือทุกความสัมพันธ์จะต้องมีความสัมพันธ์กับ Node ที่มีอยู่จริงจะไม่สามารถให้ Node มีความสัมพันธ์กับ Node ที่ไม่มีจริงได้ เช่น Node Person : DAN เวลาบอกว่ามีความสัมพันธ์แบบ Loves กับ Node ที่มีอยู่จริงเช่น Node Person : Ann จะไม่สามารถบอกว่ามีความสัมพันธ์แบบ Loves กับ Node Person : Wasinee ที่ไม่มีอยู่ใน Database ได้

  2. Relational Database

    ภาพจาก codecademy.com

    Database model นี้จะแสดงข้อมูลให้เราเห็นเป็น Relation ต่างๆ หรือจะให้เข้าใจง่ายๆคือเห็นเป็น “ตาราง” “Table” ( เดี๋ยวเราค่อยอธิบายว่า Relation ในตอนต่อๆไปว่ามันคืออะไร ตอนนี้เข้าใจว่าเป็นตารางไปก่อน ) ดังภาพ จะเห็นว่ามี Table : Product ซึ่งเราดูก็เข้าใจได้เลยว่า Table นี้เก็บข้อมูลของ Product โดยข้อมูลของ Product ประกอบไปด้วย ModelNumber , ProductName , ProductPrice , UnitCost ซึ่งก็คือ Column ส่วน Row ก็คือข้อมูลจริงๆที่ถูกเก็บไว้

    ส่วนภาษาที่เราใช้กับ Database ชนิดนี้คือภาษา SQL ( Structured Query Language ) โดยถ้าเราอยากหาข้อมูล Product ที่มี ProductPrice น้อยกว่า 200.00 ก็จะสามารถเขียนได้เป็นแบบนี้

    1
    2
    3
    SELECT *
    FROM Product
    WHERE ProductPrice < 200.00

    กฏของ Database model นี้คือ Primary key จะต้องไม่มีค่าเป็น NULL ( NULL ในที่นี้คือค่าชนิดหนึ่งที่บอกว่าไม่มีค่า ) หรือว่าง่ายๆคือ Primary key จะต้องมีค่า และ Primary key ต้องไม่มีค่าซ้ำ ส่วน Primary key คืออะไร Primary key คือค่าที่บอกว่า Row นี้แตกต่างจาก Row อื่นและเป็นคนละ Row กัน ถ้าเทียบกับในชีวิตจริงที่เห็นได้ง่ายๆคือ เลขประจำตัวประชาชน 13 หลักที่เราใช้กันนั่นแหละ กฏอีกข้อคือ Foreign Key ที่เชื่อมกันระหว่างตารางนั้นถ้ามีค่าจะต้องเป็นค่าที่มีอยู่จริง ถ้าไม่มีค่าจะต้องเป็นค่า NULL ตัวอย่างในภาพ Table : Sales มี Foreign Key ที่ Column : ModelNumber กับ Column : ModelNumber ที่ Table : Product ดังนั้น ค่า Column : ModelNumber ของ Table : Sales จะต้องมีค่าตรงกับ Column : ModelNumber ที่ Table : Product หรือไม่ก็มีค่า NULL ซึ่งจากภาพตัวอย่างจะเห็นว่าค่าตรงกันหมด

Database model ยังมีอีกมายมาย ไม่ว่าจะเป็นแบบ Object , Key-Value , Document ซึ่งแต่ละชนิดก็มีกฎและภาษาที่ใช้ต่างกัน อีกทั้ง Database model เดียวกันนั้นสามารถเข้ามีภาษาเข้าถึงได้หลายภาษา เช่น Relational Database สามารถใช้ภาษา SQL ในการเข้าถึงข้อมูล แต่จริงๆแล้วเราสามารถใช้ Relational Algebra ในการเข้าถึงข้อมูลก็ได้ แล้วก็สิ่งสำคัญที่สุดก็คือ ไม่มี Database model ไหนดีที่สุดนะครับ แต่ละ Database model ต่างมีข้อดีข้อเสียและเหมาะสมในการใช้งานในงานที่แตกต่างกันไป เช่น ถ้าคุณต้องการทำงานกับที่แสดงผลแบบ Graph แล้วเข้าใจง่าย หรืองานที่เวลาจะหาข้อมูลก็ก็ต้องการหาประมาณว่าต้องการหา Node ที่มีความสัมพันธ์ A กับ Node ที่มีความสัมพันธ์ B ที่มีความสัมพันธ์ C อย่างน้อย 3 Node ถ้าเป็นความต้องการประมาณนี้ Graph Database น่าจะตอบโจทย์กว่า ดังนั้นจะเลือกใช้งาน Database model ไหนก็ขอให้ดูความเหมาะสมและข้อจำกดต่างๆในการตัดสินใจ อย่าไปเชื่อใครที่มาบอกคุณว่า Database Model แบบ Document ดีที่สุด แบบ Graph ดีที่สุด แบบ Relational ดีที่สุด (เพราะส่วนใหญ่จะมาขายของ)

อีกเรื่องที่อยากให้รู้ไว้คือ Database model ที่เราเห็นนั้นไม่จำเป็นต้องเก็บแบบที่เราเห็นจริงๆนะครับ ในความเป็นจริงตัว DBMS จะแปลงตัว Database model ที่เราเห็นไปเก็บในรูปแบบอีกรูปแบบหนึ่งที่มีประสิทธิภาพในการ เพิ่ม ลบ แก้ไข และ ดึง อย่างรวดเร็ว ดังนั้นอย่าเข้าใจผิดว่าการลบข้อมูล Node ใน Graph Database นั้นจะต้องค่อยๆวิ่งไปใน Graph แล้วหา Node ที่ตรงเงื่อนไขแล้วลบ ในความเป็นจริง DBMS อาจจะมี Hash map ที่รู้อยู่แล้วว่า Node ที่ต้องการลบอยู่ไหนแล้วทำการลบเลยก็ได้

DBMS : Database Management System คืออะไร

ในส่วนที่แล้วเราพูดถึงว่า Database คืออะไร Database model คืออะไร คราวนี้เราสมมติว่าเราเขียนโปรแกรมเก่งมาก เราสามารถเขียนโปรแกรมที่ให้เก็บข้อมูลและแสดงผล Database model ได้ตามที่ต้องการ ทุกอย่างเหมือนจะเรียบร้อยแต่จริงๆแล้วมันยังไม่จบครับ เพราะจะมีความต้องการอื่นๆเพิ่มขึ้นมาเช่น ต้องรองรับการใช้งานจากผู้ใช้หลายคน แล้วถ้ามี User หลายคนก็ต้องเพิ่มการ Authentication เข้าไป ทีนี้แต่ละ User ก็อาจเห็นไม่เหมือนกัน ดังนั้นก็ต้องแบ่งสิทธิ์ให้เห็นไม่เท่ากันอีก คราวนี้ถ้ามีคนใช้งานเยอะๆใช้งาน Database พร้อมๆกันก็จะเกิดปัญหาเรื่องใช้การใช้งานพร้อมกัน คนนึงสั่ง Delete คนนึงสั่ง Update ตกลงจะให้อันไหนทำงาน คุณก็ต้องเขียนส่วนที่มาจัดการเรื่องนี้อีก

คราวนี้ลองคิดว่าถ้าคุณจะเขียน Application อะไรสักอย่างขึ้นมา คุณต้องมาเขียนส่วนที่เกี่ยวกับ Database แบบนี้ตลอดทุกครั้งมันก็ดูจะเป็นเรื่องที่ดูแปลกๆที่ต้องมาเขียนอะไรซ้ำๆแบบนี้ทุกครั้ง ดังนั้นเขาเลยแยกส่วนที่เกี่ยวกับการจัดการ Database ออกมาเป็น Application โดยเฉพาะ ดังนั้น Database Management System (DBMS) ก็คือ Application ที่ทำหน้าที่บริหารจัดการเกี่ยวกับ Database คราวนี้พอจะเรียกใช้งานอะไร Database ก็มาเรียกที่ DBMS แทนแล้ว DBMS ไปจัดการต่อให้

โดยหน้าที่หลักๆของ DBMS ส่วนใหญ่จะมีดังต่อไปนี้

  1. บริหารจัดการเก็บข้อมูลและแสดงผลข้อมูลตาม Database model ที่กำหนด เช่น DBMS ที่ใช้ Database model เป็น Relational Database model ก็ต้องรองรับการสั่งผ่านภาษา SQL ได้ เมื่อเรียกให้แสดงข้อมูลก็ต้องแสดงออกมาแบบที่เราสั่งเก็บไปจากตัวอย่างก็ต้องแสดงข้อมูลใน Table ออกมาให้ดูได้

  2. จัดการเรื่องสิทธิ์ของการเข้าถึงข้อมูลต่างๆใน Database ของ User ซึ่งแต่ละ User อาจจะมีสิทธิ์ไม่เท่ากัน เช่น User : Shopping Application อาจจะเข้าถึง Table ที่เกี่ยวกับสินค้าได้เท่านั้นไม่สามารถเข้าถึง Table ที่เกี่ยวกับการจ่ายเงินได้ ส่วน User : Payment application อาจจะเห็นข้อมูลเกี่ยวกับ Table : Payment เท่านั้น หรือ User บางพวกมีสิทธิ์ SELECT ดูข้อมูลอย่างเดียวไม่มีสิทธิ์แก้ไขเป็นต้น

  3. จัดการปัญหาการใช้งานข้อมูลเดียวกันพร้อมๆกันหลายคนได้ว่าจะให้คนเรียกคนไหนทำงานสำเร็จไม่สำเร็จ ถ้าถูกเรียกระหว่างการแก้ไขข้อมูลจะเห็นข้อมูลแบบไหน ในส่วนนี้ทางเทคนิคจะเรียกว่า Transaction Processing (เรื่องนี้คุยกันยาวมากครับ เดี๋ยวผมเขียนเป็นตอนใหม่อธิบาย)

  4. ทำ Query optimization ได้ ตรงนี้เราต้องมาทำความเข้าใจก่อนว่าภาษาที่สั่งให้ Database ไปทำงานนั้นบางภาษานั้นเป็นการสั่งแบบ Declarative คือสั่งว่าอยากได้อะไร ไม่ได้สั่งว่าให้ทำแบบไหน ตัวอย่างเช่น ภาษา SQL ดังตัวอย่าง

    1
    2
    3
    SELECT *
    FROM Product
    WHERE ProductPrice < 200.00

    จะเห็นว่าเป็นการสั่งให้ไปเอาข้อมูลที่มีค่า ProductPrice < 200.00 กลับมา ไม่ได้บอกว่าให้ไปเอามาอย่างไร ดังนั้นตัว DBMS จึงมีหน้าที่ไปทำให้การเข้าถึงข้อมูลได้ดีที่สุดโดยที่ผู้ใช้ไม่ได้ต้องรู้ (เรื่องนี้ก็คุยได้ยาวเหมือนกันเดี๋ยวผมเขียนแยกเป็นอีกตอนครับ)

  5. สามารถตั้งกฎและบังคับให้เก็บข้อมูลตามกฎที่กำหนดไว้ได้ ตัวอย่างเช่น ถ้าคุณตั้งกฎไว้ว่า field นี้จะต้องมีค่าไม่ซ้ำกันเลยตัว DBMS จะทำการ Check ให้ว่า field นั้นจะต้องไม่ซ้ำกันเลยใน Database หรือ ถ้าตั้งกฎว่าค่า field ที่เก็บเกี่ยวกับเงินจะต้องมีค่ามากกว่าหรือเท่ากับ 0 ตัว DBMS ก็จะทำการ Check ให้

DBMS ที่มีให้ใช้กันนั้นมีมากมายแต่ละตัวก็จะบอกว่า DBMS ของตนนั้นมี Database Model อะไร ดังนั้นเมื่อคุณคุยกันทางเทคนิคคุณอาจจะต้องลงรายละเอียดกับคนที่คุณคุยด้วยว่าเขาใช้ DBMS อะไร

ตัวอย่างอย่าง DBMS ที่มี Database model เป็นแบบ Relational Database

  • MySQL
  • MariaDB
  • DB2
  • PostgresSQL
  • Oracle Database

สรุป

สำหรับตอนนี้เราได้รู้ว่า Database , Database Model , DBMS คืออะไร ซึ่งมันจะเป็นพื้นฐานทำให้เข้าใจว่าสิ่งนี้มีไปทำไม มีไปเพื่ออะไร ในตอนถัดไปเราจะไปศึกษาเกี่ยวกับ Relational Database ซึ่งถือว่าเป็น Database model พื้นฐานที่โปรแกรมเมอร์ทุกคนควรรู้เพราะถ้าเป็นงานทั่วๆไปก็มักจะใช้ Database model ชนิดนี้

แนะนำหนังสือ

Relational database systems : language, conceptual modeling and design for engineers

หากท่านหาหนังสือเกี่ยวกับ Database ตั้งแต่เริ่มต้นมาอ่าน ผมขอแนะนำหนังสือเล่มนี้เลยครับในหนังสือจะอธิบายว่าทำไมเพราะอะไรถึงเป็นแบบนั้น สอนการใช้งานภาษา SQL ตั้งแต่พื้นฐานจนสามารถ Query ได้ทุกรูปแบบ (ผมใช้โจทย์จากหนังสือเล่มนี้สามารถ Query ได้เกือบทุกอย่างตาม Standard SQL92) สอนออกแบบ Database ด้วยวิธีต่างๆ สอนการทำ Normalization บอกเลยว่าอ่านจบก็สามารถนำความรู้ที่ได้ไปใช้ทำงานได้เลยครับ