Domain ใน SQL


อัปเดท : 14 ตุลาคม พ.ศ.2546 , แสดง : 30,528 , ความคิดเห็น : 3

ปัจจุบันส่วนใหญ่แล้วเวลาสร้างตารางไม่ต้องมานั่งพิมพ์ จะมี GUI (Graphic User Interface) ไว้ให้เลือกเอาเลยว่าจะใช้ Field อะไรบ้าง แล้วก็กดปุ่ม [drop]Down Menu ก็จะมี Data Type ให้เลือก เช่น ใน MS Access, Oracle, SQL Server ช่วยให้การสร้างตารางได้ง่ายขึ้น สามารถปรับปรุง, แก้ไข และเปลี่ยนแปลงตัว Schema ของตาราง ได้รวดเร็วขึ้น แต่อย่างไรก็ตาม เราก็ควรจะรู้ Command Line Interface ด้วยเพราะโดยมากแล้ว GUI มักจะไม่ได้มาแบบฟรีๆ มักจะต้องเพิ่มเงินในการซื้อระบบที่สะดวกต่อการใช้งาน

Domain Types ใน SQL

   ใน Database แต่ละตัวจะมี data type ที่ต่างๆ กันไปแต่คร่าวๆ ก็มีดังนี้ 

Number

    Integer (จำนวนเต็ม)
          - Short / Small : เป็น integer ที่เก็บจำนวน Byte ไม่มาก
          - Long : เป็น integer ที่เก็บจำนวน Byte เป็น 2 เท่าของ short
          - Unsigned : จำนวนเต็มตั้งแต่ 0 ขึ้นไป ไม่มีการติดลบ ซึ่งจะทำให้เก็บข้อมูลได้มากขึ้น เนื่องจากไม่ต้องเตรียมสำหรับเก็บค่าลบ ทำให้ประหยัดข้อมูลไปได้เท่าตัว เช่น ข้อมูลของเราเก็บได้ตั้งแต่ –128 ถึง 128 ถ้าไม่จำเป็นต้องเก็บฝั่งลบแล้ว ก็จะทำให้สามารถเก็บข้อมูลได้ถึง 256 ตัว

    Real (จำนวนจริงที่มีทศนิยม)
          - Decimal : ในบางระบบใช้สำหรับข้อมูลที่เป็นเลขทศนิยม แต่วิธีในการเก็บจะต่างจาก Floating Point คือ ในการเก็บแบบ Floating Point นั้นจะไม่มีการกำหนดตำแหน่งของทศนิยมที่แน่นอน แต่ใน Decimal จะกำหนดตายตัวไปเลยว่าจะเอาทศนิยมกี่ตำแหน่ง แล้วมันก็จะคำนวณอย่างนั้นจริงๆ ซึ่งการเก็บข้อมูลแบบ Decimal จะค่อนข้างเปลืองพี้นที่มากกว่าแบบ floating Point
          - Floating Point Number : อาจจะใช้ 4 Byte ในการเก็บข้อมูล แต่ขนาดจะเป็นเท่าไหร่ขึ้นกับ Database แต่ละตัวและระบบที่ใช้งาน เช่น ระบบที่ run บน UNIX ของ DB2 อาจจะใช้ 8 Byte แต่พอมาเป็น DB2 สำหรับ PC อาจจะเหลือ 4 Byte เป็นต้น อันนี้เป็นการยกตัวอย่างไม่ได้เป็นอย่างนั้นจริงๆ ทั้งนี้ก็ขึ้นกับ Database แต่ละตัว หรือแม้แต่ Database ตัวเดียวกันถ้า run บนคนละ Platform ประเภทของข้อมูลก็อาจจะใช้ขนาดต่างๆ กัน
          - Double floating point : อาจจะใช้ 8 Byte คือ เป็น 2 เท่าของ floating point ซึ่งก็จะมีลักษณะเช่นเดียวกับ Short และ Long Integer สำหรับ Format ในการเขียนนั้น ยกตัวอย่างเช่น

                              number (5) หมายความว่าเป็น integer
                              number (5,2) หมายความว่าเป็น real

  
 

 Date / Time

    Date : ข้อมูลวันที่
    Time : ข้อมูลเวลา
    Timestamp : เป็นการรวมวันที่กับเวลาไว้ด้วยกันเพื่อบอกตำแหน่งของเวลาที่แน่นอน
    Interval : มีไว้บวก ลบ ข้อมูลเกี่ยวกับเวลา

 String / Character

Variable Length ([varchar]) : ความยาวไม่คงที่ ใน Database บางตัวเขียนเป็น [varchar] (30) แต่ใน Database บางตัว เช่นใน Oracle เขียนเป็น [varchar]2( ) ซึ่งอาจจะเป็น Version 2 หรืออะไรก็ไม่แนใจเหมือนกัน หรือในบางครั้งอาจเขียนเป็น text ()

Fixed Length (Char) : ความยาวคงที่ สมมติว่าในการสร้างขึ้นมา 1 Record เช่น Student Record มี Field ID กับ Name สามารถเขียนได้เป็น

                              ID number (5)
                              Name [varchar] (30)


ความหมายคือ ให้ Field ID เป็นเลข 5 หลัก ส่วน Name เป็นตัวอักษร 30 ตัว แต่ในที่นี้เป็นvariable Length ถ้านักเรียนมีชื่อแค่ 5 ตัวอักษร ก็จะเก็บแค่ 5 ตัวอักษร ส่วนที่เหลืออีก 25 ตัวว่างอยู่ไม่ได้ใช้ จะไม่กินเนื้อที่ตรงนั้น ก็สามารถเอา Record ที่ 2 มาต่อได้เลย ดังรูป

แต่สมมติว่า Name ของ Record ที่ 2 ยาว 35 มันก็จะกินที่แค่ 30 ส่วนอีก 5 ก็จะถูกตัดทิ้งไป

ข้อดีของ variable Length Character คือ เวลาเก็บลงไปในฐานข้อมูลจะประหยัดเนื้อที่ เพราะให้เก็บเท่าที่ใช้จริงเท่านั้น แต่ในความเป็นจริงแล้ว มันไม่ได้ใช้เนื่อที่แค่ 5 หรือ 30 มันต้องมีเนื้อที่อีกส่วนหนึ่งมาจับขนาดความยาวว่า ชื่อนี้ยาว 30 หรือว่าชื่อนี้ยาว 5 ซึ่งใช้เนื้อที่เพียงนิดเดียว ถ้าเราไม่คำนึงถึงตรงนั้น ก็จำแค่ว่ามันเก็บเท่าที่มันต้องการใช้เก็บจริง

ข้อเสียของ variable Length Character คือ สมมติว่าต้องหา Record ที่ 50 เราไม่สามารถกะประมาณได้ว่าแต่ละ Record จะยาว 35 ถ้าจะไป Record ที่ 50 ก็คูณด้วย 50 เข้าไป ได้ค่าเท่าไหร่ก็ไปที่ Byte นั้น ซึ่งทำแบบนี้ไม่ได้ เพราะว่าบาง Record ก็ยาวแค่ 10, 15, 28 แต่ละ Record ยาวไม่เท่ากัน ดังนั้นถ้าต้องการไปที่ Record ที่ 50 ก็ต้องมาดูว่า Record ที่ 1 ยาวเท่าไหร่ Record ต่อมายาวเท่าไหร่ ไล่ไปเรื่อยๆ ทำให้การเข้าถึงข้อมูลทำได้ช้า เพราะว่าต้องไปทีละ step แต่ก็มีวิธีการทำให้เร็วขึ้น เช่น อาจจะมี Directory เอาไว้ที่หัว File ว่า Record ที่ 1 ใช้ความยาวเท่าไหร่, Record ที่ 2 ใช้ความยาวเท่าไหร่ หรือไม่ก็บอกว่า Record ที่ 1 เริ่มต้นที่ Byte ไหน, Record ที่ 2 เริ่มต้นที่ Byte ไหน เป็นต้น ดังนั้นแล้ว ก็ไม่ต้องไปทีละ Record มันมาดูที่ Directory ข้างหน้านี้ก็ไปได้เหมือนกัน แต่ว่าก็จะกินที่ Directory นี้อีกเพื่อจะจดจำว่า Record ไหน วางอยู่ตรงไหน

จากการดูข้อดีข้อเสียแล้ว ก็ขึ้นอยู่กับว่าใครจะเลือกใช้แบบไหน variable Length หรือ Fixed Length สำหรับการ Encode ข้อมูลใน Oracle นั้นจะใช้เป็น variable Length Character ทั้งหมดเลย แต่ทั้งนี้ไม่ได้หมายความว่าเราจะไม่มีสิทธิ์ใช้ Char คือ แต่เราจะยังสามารถใช้ Char ได้อยู่ ในกรณี Fixed Length นั้น สมมติว่าให้เก็บ ID ได้ 5 Byte และเก็บ Name ได้ 30 Byte ถ้าเรามี Record ที่ 1 เป็น ID 3 Byte ก็จะเก็บไว้ 3 เหลือที่อีก 2 ก็ปล่อยให้ว่างไว้อย่างนั้น ถ้า Name มี 18 ก็เก็บไว้ 18 ส่วนที่เหลืออีก 12 ก็ปล่อยให้ว่างไว้อย่างนั้น แล้วก็เอา Record ที่ 2 มาต่อได้เลย สมมติว่า Record ที่ 2 มี Name เป็น 35 ก็จะสามารถเก็บได้แค่ 30 อีก 5 ตัดทิ้งไป ดังรูป


ดังนั้นแสดงว่าการกำหนดแบบ Char ก็จะทำให้เราเสียเนื้อที่ไป แต่หลักการคร่าวๆ เวลาที่เราสร้างตารางมาโดยส่วนใหญ่แล้ว ถ้าเป็นตัวอักษรที่มีจำนวนมากๆ หน่อย เราก็มักจะใช้เป็น [varchar] เผื่อว่ามันจะขยายพื้นที่ขึ้นมาได้บ้าง เช่น ชื่อ, นามสกุล, ชื่อบริษัท ก็มักจะใช้เป็น [varchar] แต่สำหรับบาง Field ที่มันไม่ยาวมาก เช่น Field ที่เป็นรหัสสินค้า บางทีรหัสสินค้าอาจจะมีตัวอักษรอยู่ด้วย ก็มักจะใช้เป็น Char โดยเฉพาะ Field ที่มักจะใช้เป็น Primary Key หรือ Foreign Key ก็มักจะไม่ใช้ [varchar] เพราะว่าตอนเอาไป JOIN กันมันจะยุ่งยากกว่า เมื่อเปรียบเทียบกับ Field ที่เป็น Fixed Length เป็นต้น

  
 
Large Object

นอกจากนี้แล้วก็ยังมีข้อมูลที่มีขนาดใหญ่มากๆ เราเรียกว่า Large Object ที่มีใช้กันมานานพอสมควรแล้ว โดยมากเรามักจะเห็นในรูปของ BLOB (binary Large Object) เอาไว้เก็บข้อมูลที่มีขนาดไม่แน่นอนมากๆ มีขนาดใหญ่มากและข้อมูลมักจะเป็น Propriety Format คือ Format ที่แล้วแต่บริษัทไหนจะกำหนดมา เช่น ข้อมูลที่เป็น mpeg, ข้อมูลที่เป็น web wide, ข้อมูลที่เป็น MS Document, ข้อมูลที่เป็น Lotus note หรืออะไรก็แล้วแต่
ฐานข้อมูลจะมีข้อมูลประเภท BLOB เอาไว้ให้เก็บข้อมูลที่เป็นอย่างอื่นลงไปในฐานข้อมูลได้ ไม่จำเป็นต้องเป็น string หรือ integer หรือ date/time แต่เป็นข้อมูลจากที่ไหนก็ได้ มันเหมือนเป็น Chunk ของข้อมูล เมื่อเราอยากจะเก็บอะไรลงไปก็เก็บได้ โดยที่ Database จะถือว่านี่คือก้อนของข้อมูลอันหนึ่ง เพียงแต่บอกมาว่าอยากเก็บอย่างนี้ Database ก็จะเก็บให้ แต่มันไม่สามารถเข้าไปอ่านก้อนนั้นได้ มันอ่านข้อมูลให้เราได้ แต่อ่านแล้วมันแปลไม่ออกว่าข้อมูลนั้นคืออะไร ถ้าเราอยากจะแปลว่า Chunk ของ Data นี้คืออะไร เราก็ต้องไปเรียกเอาโปรแกรมที่ผลิตตัวนี้ขึ้นมา เช่น ถ้าเราเขียน mpeg File ลงไปในฐานข้อมูล เราก็ต้องไปเรียกให้ Database เอา mpeg นั้นออกมา แล้วเราก็ไปเอาโปรแกรมที่อ่าน mpeg นั้นได้มาอ่านอีกที หรือถ้าเป็น Image File ก็ต้องไปเอา Image processing program มาอ่านจาก Database อีกที

การเก็บ BLOB โดยมากแล้ว เวลาที่ Database มันเก็บข้อมูล ลองนึกถึง Disk ที่เป็นก้อน ซึ่งเก็บข้อมูลตาม sector ต่างๆ และข้อมูลพวกนี้รวมกันอยู่เป็น Block ต่างๆ แล้วแต่ละ Record ก็เก็บลงไปในแต่ละ Block ของ Disk โดยมากแล้ว Record พวกนี้มันก็จะขนาดเท่าๆ กันหมด เช่น Student Record อาจจะมี ID, Name ความยาวมันก็อาจจะประมาณ ID 5 Byte ส่วน Name 30 Byte รวมเป็น 35 Byte การเก็บข้อมูลพวกนี้ลงไปใน File โดยตรง นั้นทำได้ แต่ถ้าเก็บ Photo ของนักเรียนแต่ละคนลงไป ซึ่งจะพบว่า jpeg บางอันก็ใหญ่มาก บางอันก็เล็ก ไม่แน่นอน ในการเก็บลงในฐานข้อมูลมันไม่ได้เก็บเอา Image ไว้กับ Record โดยตรง เช่น เรามี ตาราง อยู่ มี Field ID (number), Name (string), photo (jpeg File) ซึ่ง ID ก็จะเก็บเป็น 1,2,3,4,… ส่วนชื่อก็จะเป็น นาย ก, นาย ข หรืออะไรก็ว่าไป แต่รูปภาพมันจะไม่ได้เก็บไว้ที่นี่ มันจะเก็บเอา address ของรูปภาพนี้ แล้วเอารูปภาพนี้ไปเก็บไว้ที่อีกที่หนึ่งในฐานข้อมูล เก็บไว้ต่างหาก เก็บของนักเรียนแต่ละคนเรียงกันไป เก็บต่อๆ กันไป คนที่1,2,3,.... การเก็บแบบนี้ทำให้ Record Size เล็กลง ตาราง เล็กลง การประมวลผลก็ทำได้เร็วขึ้น

ใน Dbase, Foxbase, Foxpro ก็จะมี Field ประเภทนึงเรียกว่า memo ซึ่งก็เป็นข้อมูลประเภท BLOB นี่เหมือนกัน คือ มันเป็น Field ที่เก็บข้อมูลขนาดใหญ่เอาไว้ ดังนั้นมันจะไม่เก็บไว้ที่ตัว ตาราง นั้นเอง แต่มันจะเอาไปเก็บไว้อีกที่นึง ทำให้ ข้อมูลนั้นมีประสิทธิภาพมากขึ้น แต่ถ้าเป็นข้อมูลที่เก็บเฉพาะตัวอักษรก็มักจะมีชื่อเรียกว่า clob (Character Large Object) ใช้ในกรณีที่ต้องการเก็บข้อมูลตัวหนังสือที่ค่อนข้างยาว เช่น เก็บบทความย่อของเอกสารแต่ละเรื่อง หรือเป็นข้อความบรรยายที่ค่อนข้างยาว ซึ่งอาจยาว 2-3 หน้า หรือ 3-4 บรรทัด ไม่แน่นอน ก็มักจะเก็บในลักษณะนี้ เป็นต้น


ผู้เขียน/อ้างอิง : จักรกฤษณ์ แร่ทอง

เทคโนโลยีฐานข้อมูล

ความคิดเห็น/แนะนำ/ติชม/อื่นๆ

  • เษษฐ์ [24 Jun 2005 , 09:28 AM]

    ใน SQL ถ้าจะใช้เครื่องมือที่เป็น yes/no ทำงัยคัรบ

  • Tan [15 Sep 2005 , 07:06 PM]

    เรามีวิธีการเลือกใช้โปรแกรมฐานข้อมูลอย่างไรหรอคะ อย่างเช่น MS Access, SQL server , Oracle เป็นต้น ซึ่งแต่ละตัวจะมีความยืดหยุ่นต่อการใช้งาน ความยากง่าย ความเหมาะสม แตกต่างกันอย่างไรบ้างคะ

  • โตโร่ [15 ม.ค. 2549 , 09:33 PM]

    ใช้ boolean ครับ (True,False)