Skip to main content

ข้อกำหนด (Specifications) ของโครงสร้างข้อมูลร่วม

รูปแบบโครงสร้างข้อมูลร่วม (Common Schema) มาตรฐาน CMKL v1.0 ถูกออกแบบเพื่อการแปลงให้ชุดข้อมูล (Dataset) ที่จะถูกนำเข้ามาจัดเก็บและแลกเปลี่ยนในระบบของแพลตฟอร์ม ให้อยู่ในรูปแบบที่สามารถใช้ร่วมกัน (Integrate) ได้ง่าย ทำให้สามารถขยายผลงานวิจัยที่ต้องอาศัยชุดข้อมูลจำนวนมากได้อย่างมีประสิทธิภาพ นอกจากนี้ยังสามารถใช้เป็นแนวทางในการออกแบบโครงสร้างชุดข้อมูล (Dataset Schema) ในอนาคตสำหรับงานวิจัยอื่นๆ เพื่อให้มีมาตรฐานเดียวกันอีกด้วย

รูปแบบของไฟล์ชุดข้อมูล#

มาตรฐานรูปแบบของไฟล์ชุดข้อมูล (Data Format Standard) นี้ ใช้กับไฟล์ชุดข้อมูลแบบที่มีโครงสร้าง (Structured Data) ซึ่งไม่รวมไฟล์สื่อชนิดต่างๆ ที่รวมอยู่ในชุดข้อมูล เช่น ภาพ เสียง วิดีโอ ไฟล์ชุดข้อมูลตามมาตรฐาน CMKL v1.0 จะต้องมีรูปแบบดังนี้

  1. ไฟล์ชุดข้อมูล ต้องถูกจัดเก็บอยู่ในรูปแบบของ JSON ที่ถูกต้องตามมาตรฐาน ECMA-404
  2. ข้อมูลแต่ละ field ต้องถูกจัดเก็บในรูปแบบของชนิดข้อมูลพื้นฐาน ได้แก่ string, number, boolean, null เพื่อให้เป็นไปตามมาตรฐาน JSON
  3. ชื่อของ key แต่ละ key ให้อยู่ในรูปแบบ snake_case

ตัวอย่าง

// ตัวอย่างที่ถูกต้อง
{
...
"example_key_1": true,
"example-key_2": 12.34,
...
}
// ตัวอย่างที่ผิด
{
...
"exampleKey1": true,
"exampleKey2": 12.34,
...
}
  1. ไม่อนุญาตให้ข้อมูลชั้นนอกสุด (top-level) เป็นประเภท array จะต้องมี object ครอบเสมอ
// ตัวอย่างที่ถูกต้อง
{
"records": [
{ "name": "A" },
{ "name": "B" },
...
]
}
// ตัวอย่างที่ผิด
[
{ "name": "A" },
{ "name": "B" },
...
]
  1. ให้ใช้ค่า (Value) ต่างๆ ที่เป็นชนิดข้อมูลเชิงประกอบ (Composite Data Type) ใน JSON Object และมีชนิดตามตารางด้านล่าง จะต้องถูกจัดเก็บอยู่ในรูปแบบดังต่อไปนี้
ชนิดข้อมูลคำอธิบายรูปแบบข้อมูลข้อกำหนดรูปแบบตัวอย่าง
หมวดวันที่และเวลา
dateวันที่ (Date)stringอยู่ในรูปแบบวันที่ตามมาตรฐาน ISO-8601 (yyyy-mm-dd)"2021-01-18"
timestampตราประทับเวลา (Timestamp)stringอยู่ในรูปแบบวันที่และเวลาตามมาตรฐาน ISO-8601 โดยควรระบุเขตเวลา (Time Zone) ด้วย (yyyy-mm-ddThh:mm:ss[.sss]+zh:zm) หากไม่ระบุจะถือว่าอยู่ในเขตเวลา UTC+0""2021-01-18T13:49:37.261134+07:00""
durationตราประทับเวลาแบบสัมพัทธ์ (Relative Timestamp) หรือระยะเวลา (Duration)stringอยู่ในรูปแบบเวลาเป็นชั่วโมง:นาที:วินาที.ส่วนของวินาที โดยละชั่วโมง หรือส่วนของวินาทีได้ ([hh:]mm:ss[.sss])(หมายเหตุ: หากต้องการระบุระยะเวลาเป็นชั่วโมง จะต้องเขียนความละเอียดถึงวินาทีเสมอ)"2:01" (สองนาที หนึ่งวินาที)"1:20:59.124" (หนึ่งชั่วโมง ยี่สิบนาที ห้าสิบเก้าวินาที หนึ่งร้อยยี่สิบสี่มิลลิวินาที)"1:20:00" (หนึ่งชั่วโมง ยี่สิบนาที)
หมวดภูมิศาสตร์
geolocationพิกัดภูมิศาสตร์ (Geolocation)[longitude: number, latitude: number]เป็น Array ของตัวเลขพิกัด 2 ตัว ขึ้นต้นด้วยลองจิจูด ตามด้วยละติจูด[100.778743, 13.727640]
placeชื่อสถานที่ (Place)string-"Bangkok"
หมวดตัวอ้างอิง
file_referenceที่อยู่ของไฟล์ (File Reference)stringเป็น UNIX File Path ใช้ / เพื่อแบ่งโฟลเดอร์"/images/example-01.png"
urlURLstringต้องเป็น URL ที่ถูกต้องตามมาตรฐานของ WHATWG"https://www.cmkl.ac.th/"
emailอีเมล (Email)stringอยู่ในรูปแบบที่อยู่อีเมล (local-part@domain)"info@cmkl.ac.th"

ไฟล์คำอธิบายลักษณะของชุดข้อมูล (Dataset-level Metadata File)#

แต่ละชุดข้อมูลจะมีไฟล์คำอธิบายลักษณะของชุดข้อมูล 1 ไฟล์ เพื่อแสดงข้อมูลเกี่ยวกับชุดข้อมูลนี้ (metadata) เช่น ชื่อชุดข้อมูล ชื่อเจ้าของข้อมูล เป็นต้น โดยไฟล์คำอธิบายนี้จะอยู่ในรูปแบบ JSON ดังนี้ (สามารถเติม key อื่นๆ นอกเหนือจากนี้เพื่อใช้อธิบายชุดข้อมูลได้ แต่จะต้องมี key ขั้นต่ำดังต่อไปนี้)

// <dataset_name>.metadata.json
{
"name": <name of the dataset>,
"description": <name of the dataset>,
"author": <name of dataset author(s)>,
"license": <type of dataset license or link to license agreement>,
"updated_at": <ISO-8601 timestamp of time updated>,
"created_at": <ISO-8601 timestamp of time created>,
"file_types": [
{
"type": <filetype e.g. "csv", "jpg", etc.>
"count": <number of files of that type in the dataset>
},
... // each array entry for each file type
]
}

ไฟล์คำอธิบายโครงสร้างของไฟล์ข้อมูล (File-level Schema File)#

ไฟล์ข้อมูลแต่ละไฟล์ในชุดข้อมูลหนึ่งๆ อาจมีไฟล์คำอธิบายโครงสร้างของชุดข้อมูลประกอบด้วย โดยไฟล์คำอธิบายนี้จะอยู่ในรูปแบบที่ขยายมาจากมาตรฐาน JSON Schema ดังต่อไปนี้

// <name of original data file>.schema.json
{
"filename": <name of original data file>,
"filename_processed": <name of processed data file>,
"preprocess_timestamp": {
"start": <ISO-8601 timestamp of processing start time>,
"end": <ISO-8601 timestamp of processing end time>
},
"schema": <extended JSON Schema format>
}

สำหรับส่วน “Extended JSON Schema Format” คือรูปแบบข้อมูลตามมาตรฐาน JSON Schema แต่

  1. มีชนิดข้อมูลเพิ่มขึ้น โดยสามารถเป็น
    • ชนิดข้อมูลพื้นฐาน (number, string, boolean, object, array, null)
    • ชนิดข้อมูลประกอบตามตารางด้านบน (date, timestamp, duration, geolocation, place, file_reference, url, email)
    • ชนิดข้อมูลอื่นๆ เช่น “key” (ใช้เพื่อเป็นคำอ้างอิงของจุดข้อมูลหนึ่งๆ)
  2. สามารถเพิ่ม key ในแต่ละ object เพื่ออธิบายข้อมูลในกลุ่มนั้นได้ เช่น หน่วย ค่าสูงสุด/ต่ำสุด/เฉลี่ย ของข้อมูลที่เป็นตัวเลข

ดังตัวอย่างด้านล่าง

{
"filename": "people.json",
"filenameProcessed": "people.processed.json",
"preprocessTimestamp": {
"start": "2021-01-25T09:20:01+00:00",
"end": "2021-01-25T09:20:05+00:00"
},
"schema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://example.com/people.schema.json",
"title": "People",
"description": "List of people we have data about.",
"type": "object",
"properties": {
"records": {
"type": "array"
"items": {
"type": "object"
"properties": {
"id": {
"type": "key" //ตัวอย่างของ 1.2.1 c.
}
"name": {
"type": "string" //ตัวอย่างของ 1.2.1 a.
},
"birthdate": {
"type": "date" //ตัวอย่างของ 1.2.1 b.
},
"height": {
"type": "number", //ตัวอย่างของ 1.2.1 b.
"unit": "centimeters", //ตัวอย่างของ 1.2.2
"min": 145, //ตัวอย่างของ 1.2.2
"max": 192 //ตัวอย่างของ 1.2.2
}
}
}
}
}
}
}

โครงสร้างชุดข้อมูลร่วมเฉพาะเรื่อง (Domain-Specific Common Schema)#

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

รูปแบบไฟล์สำหรับ “ชุดข้อมูลอนุกรมเวลา (Time-Series) แสดงระดับค่าที่วัดได้จากเซ็นเซอร์” (เช่น ค่าฝุ่น PM 2.5) เป็นตัวอย่างให้นักวิจัยที่ศึกษาในด้านดังกล่าว ไว้ดังนี้

// Example schema for time-series dataset files of sensor readings.
{
"records": [
{
"time": <เวลาที่วัดค่า: timestamp>,
"location": <ตำแหน่งที่ติดตั้งเซนเซอร์: geolocation>,
"name": <ชื่อตัวแปรที่วัด เช่น pm2_5: string>,
"value": <ค่าที่วัดได้: any>,
},
... // หมายเหตุ: 1 javascript object ต่อ 1 ค่าที่อ่านได้ หากอ่านได้หลายตัวแปรในเวลาเดียวกัน ให้แยกแต่ละค่าที่อ่านได้ไว้ให้คนละ object กัน
]
}

โดยจะรวบรวมตัวอย่างของรูปแบบโครงสร้างชุดข้อมูลเหล่านี้ไว้ที่ ภาคผนวก: ตัวอย่างมาตรฐานโครงสร้างชุดข้อมูลร่วมเฉพาะเรื่อง (Domain-Specific Common Schema)