Oracle JSON Document Store
การจัดเก็บข้อมูลในรูปแบบของ JSON Document นั้น โดยปกติจะถูกจัดเก็บในรูปแบบของ NoSQL Database ซึ่งเป็นระบบฐานข้อมูลที่ใช้สำหรับระบบฐานข้อมูลที่มีขนาดใหญ่ และ อยู่ในรูปแบบกระจาย (Large and Distributed Databases) โดยรูปแบบการจัดเก็บอยู่ในรูปแบบของ Key, Value ซึ่งแต่ละข้อมูลจะถูกกำหนด Unique key เพื่อไม่ให้เกิดความซ้ำซ้อนของข้อมูล โดยใช้ Key เป็นตัวจัดการเข้าถึงข้อมูลนั้น ๆ ประโยชน์ของการจัดเก็บข้อมูลแบบ NoSQL สามารถแบ่งได้เป็น 3 ส่วนดังนี้
- Elastic Scaling การยืดหยุ่นในการขยายการจัดเก็บข้อมูลได้มากขึ้น โดยสามารถจัดเก็บในรูปแบบของการกระจายข้อมูลที่มีหลาย ๆ โฮส ได้
- Big Data สำหรับจัดเก็บข้อมูลที่มีขนาดใหญ่ ซึ่งระบบการจัดการฐานข้อมูลเชิงสัมพันธ์ (RDMS) ไม่สามารถรองรับได้
- DBA Specialists เหมาะสำหรับผู้ที่ไม่จำเป็นต้องมีความเชี่ยวชาญมากในการจัดการฐานข้อมูล โดย RDMS จะต้องการผู้เชี่ยวชาญที่มีความสามารถสูงในการจัดการข้อมูล แต่ NoSQL ไม่จำเป็น
โดย NoSQL ก็จะมีข้อเสีย ซึ่งสามารถแบ่งเป็น 3 ส่วนเช่นกันคือ
- Administration โดยที่ NoSQL ไม่มีการกำหนดผู้ดูแลระบบอย่างชัดเจน
- Analytics and Business Intelligence ไม่เหมาะสมสำหรับการทำ ac hoc query เพราะได้ถูกออกแบบมาใช้สำหรับ Web 2.0
- Lack of Expertise ผู้ที่เชี่ยวชาญทางด้าน NoSQL ยังมีน้อย
ตัวอย่างการเก็บข้อมูลแบบ JSON
Array in JSON
ในกรณีที่ข้อมูลมีหลายชุด สามารถจัดทำเป็นข้อมูลประเภท Array ได้ โดยให้อยู่ในรูปของ [ ] และ แยกชุดข้อมูลด้วยเครื่องหมาย Comma (,)
ในกรณีที่มีข้อมูลที่ซับซ้อน สามารถเขียนได้ดังนี้
โดย Oracle Database 12c สามารถที่จะรองรับการจัดเก็บข้อมูลในรูปแบบของ JSON ได้
- สามารถจัดเก็บและจัดการข้อมูลในรูปแบบของ JSON และ XML ได้
- เข้าถึงข้อมูลโดยใช้ภาษาในการเขียนโปรแกรมได้
- สามารถใช้คำสั่ง Query โดยใช้ JSON Path, XQuery และ SQL ได้
- จัดการ indexing ได้
- ไม่จำเป็นต้องเรียน SQL หรือ DBA เพิ่มเติมสำหรับนักพัฒนาซอฟต์แวร์
- รองรับการทำงาน DevOPS paradigm
การนำเข้าข้อมูล JSON ไปยัง Oracle Database
- สร้างตารางสำหรับจัดเก็บข้อมูล โดยชนิดของข้อมูลที่สามารถจัดเก็บ JSON ได้ คือ CLOB, BLOB และ VARCHAR2 เท่านั้น
SQL > DROP TABLE products;
SQL > CREATE TABLE products (
prod_id NUMBER NOT NULL PRIMARY KEY,
product_info CLOB,
CONSTRAINT product_info_json_chk CHECK (product_info IS JSON (STRICT)));
- การนำเข้าข้อมูลโดยการเพิ่มข้อมูลเข้าไปทีละแถว ดังนี้
SQL>insert into products values (2,
'{
"name" : "Cable TV Basic Service Package",
"type" : "tv",
"monthly_price" : 50,
"term_years" : 2,
"cancel_penalty" : 25,
"sales_tax" : true,
"additional_tariffs" :
[
{
"kind" : "federal tariff",
"amount" : { "percent_of_service" : 0.06 }
},
{
"kind" : "misc tariff",
"amount" : 2.25
}
]
}'
);
SQL > commit;
- การเพิ่มข้อมูลจากการอ่านไฟล์จากภายนอก
1) สร้างตารางสำหรับจัดเก็บข้อมูล
Create table J_PURCHASEORDER
(ID RAW(16) NOT NULL,DATE_LOADED TIMESTAMP(6) WITH TIME ZONE,
PO_DOCUMENT CLOB CHECK (PO_DOCUMENT IS JSON));
2) กำหนดสิทธิ์ในการอ่านข้อมูลจากโฟล์เดอร์ที่ต้องการ
CONNECT SYS/password as sysdba
CREATE OR REPLACE DIRECTORY order_entry_dir AS 'C:\LAB';
GRANT READ,WRITE ON DIRECTORY order_entry_dir TO HR;
3) สร้างตารางสำหรับผู้ใช้ HR สำหรับการเข้าถึงข้อมูล JSON โดยระบุชื่อไฟล์ที่จะนำเข้าคือ PurchaseOrders.dmp
CONNECT hr/password
DROP TABLE json_dump_file_contents;
CREATE TABLE json_dump_file_contents (json_document CLOB)
ORGANIZATION EXTERNAL (TYPE ORACLE_LOADER DEFAULT DIRECTORY order_entry_dir
ACCESS PARAMETERS
(RECORDS DELIMITED BY 0x'0A'
FIELDS (json_document CHAR(5000)))
LOCATION (order_entry_dir:'PurchaseOrders.dmp'))
PARALLEL;
4) เพิ่มข้อมูลเข้าไปในตาราง j_purchaseorder ที่ได้สร้างไว้
INSERT INTO j_purchaseorder
SELECT SYS_GUID(), SYSTIMESTAMP, json_document FROM json_dump_file_contents
WHERE json_document IS JSON;
COMMIT;
- การ Query ข้อมูลจาก JSON Table สามารถทำได้ดังตัวอย่างต่อไปนี้
SELECT
JSON_VALUE(PO_DOCUMENT ,'$.PONumber') PO,
JSON_VALUE(PO_DOCUMENT ,'$.Reference') REFERENCE,
JSON_VALUE(PO_DOCUMENT ,'$.CostCenter') COSTCNTER,
JSON_VALUE(PO_DOCUMENT ,'$.ShippingInstructions.name') NAME
from J_PURCHASEORDER
where JSON_VALUE(PO_DOCUMENT ,'$.PONumber') IN (1600,1700);
ซึ่งจะปรากฎผลลัพธ์ดังรูปต่อไปนี้