Tags:
Topics: 
Node Thumbnail

SQLite โครงการฐานข้อมูล SQL ขนาดเล็กออกเวอร์ชั่น 3.45.0 เวอร์ชั่นแรกของปีนี้ โดยมีความเปลี่ยนแปลงสำคัญคือการเปลี่ยนโครงสร้างข้อมูลของฟิลด์แบบ JSON ให้เป็นไบนารี JSONB เพื่อเร่งประสิทธิภาพการทำงาน

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

JSONB เป็นชื่อประเภทข้อมูลที่เริ่มใช้งานโดย PostgreSQL เพื่อเร่งความเร็วการประมวลผล JSON อย่างไรก็ดี SQLite นั้นไม่ได้ใช้โค้ดของ PostgreSQL แต่เขียนขึ้นใหม่เอง และมีความแตกต่างกันพอสมควร การประมวลผลบางอย่างมี big-O ไม่เท่ากัน

ตัวฟิลด์ JSONB นั้นเป็น BLOB ธรรมดา และผู้ใช้สามารถแก้ไขไบนารีได้โดยตรง แต่ทางโครงการเตือนว่าการแก้ไขจน JSONB ผิดรูปแบบ (malformed) อาจจะทำให้ผลลัพธ์คาดเดาไม่ได้ บางทีอาจจะคืนค่าถูก บางทีอาจจะคืนค่า error ว่าอ่านไม่ได้ รวมถึงแต่ละเวอร์ชั่นก็จะไม่รับประกันว่าจะได้ค่าเหมือนเดิม

ที่มา - SQLite

Get latest news from Blognone

Comments

By: Azymik on 16 January 2024 - 21:41 #1303586

การแก้ไขจน JSONB ไม่ผิดรูปแบบ

อันนี้งงๆ นิดนึงครับ

By: lew
Founder Jusci's WriterMEconomics Android
on 16 January 2024 - 22:22 #1303591 Reply to:1303586
lew's picture

คำว่า "ไม่" เกินมา :/


lewcpe.com , @wasonliw

By: rattananen
Android Windows
on 17 January 2024 - 09:12 #1303617

คนออกแบบ database สมัยใหม่ เริ่มจะลืม normalization N1 N2 N3 หมดแล้วจะใช้ field type เป็น json ลูกเดียว พอต้องแก้ schema ทีนี้อย่างเหนื่อย

By: hisoft
Contributor Windows Phone Windows
on 17 January 2024 - 09:51 #1303620 Reply to:1303617
hisoft's picture

+1 ออกโจทย์สัมภาษณ์ต้องบอกเพิ่มว่าไม่ใช้ JSON 🥲

By: veer
Windows Phone Ubuntu
on 17 January 2024 - 11:01 #1303631 Reply to:1303620
veer's picture

ต้องออกโจทย์แก้โครงสร้าง JSON ด้วย SQL ด้วยเปล่าครับ ? หรือว่าไม่ได้ใช้ ?

By: veer
Windows Phone Ubuntu
on 17 January 2024 - 11:04 #1303633 Reply to:1303617
veer's picture

ผมเห็นด้วยว่า normal forms เป็นเรื่องสำคัญนะครับ แต่สงสัยว่าทำไมเวลาแก้ schema และใช้ json แล้วเหนื่อย

เวลาแก้โครงสร้างไม่ได้สั่ง update ธรรมดาหรือครับ ? หรือว่า record เยอะก็เลยเหนื่อย ? หรือว่าเขียน schema ไว้ด้วยภาษาอื่นแล้วต้องมาแปลงเป็น SQL update ก็เลยเหนื่อย ?

By: big50000
Android SUSE Ubuntu
on 17 January 2024 - 13:07 #1303654 Reply to:1303633
big50000's picture

ผมว่าเขาน่าจะหมายถึงวิธีการจัดเก็บข้อมูล บางคนเล่นเก็บแบบ JSON ล้วน ไม่ใช้ความสามารถของ Database กันเลย องค์ความรู้เดิมเกี่ยวกับ Relational Database เลยหายไป และความบรรลัยบังเกิดเมื่อฐานข้อมูลสเกลขึ้นแล้วต้องแยกข้อมูลออกจาก JSON

พอผมมองอีกที ถ้าใช้แต่ JSON ทำไมคนพวกนั้นเขาไม่ใช้ MongoDB หรือพวก Document Database กันไปเลยนะ

By: veer
Windows Phone Ubuntu
on 17 January 2024 - 14:55 #1303672 Reply to:1303654
veer's picture

พอผมมองอีกที ถ้าใช้แต่ JSON ทำไมคนพวกนั้นเขาไม่ใช้ MongoDB หรือพวก Document Database กันไปเลยนะ

MongoDB เคยพบว่าเปลี่ยน version แล้ว query เก่าใช้ไม่ได้ กอปรกับมีประเด็นเรื่อง license นอกจากนั้นหลายกรณี SQLite ตัดตั้งสะดวกกว่ามากครับ

จริง ๆ มี ferretdb ที่เป็น proxy ให้ PostgreSQL กับ SQLite ใช้ wire protocol ได้ แต่ไม่แน่ใจว่ามันพร้อมใช้งานขนาดไหน

By: big50000
Android SUSE Ubuntu
on 17 January 2024 - 15:17 #1303676 Reply to:1303672
big50000's picture

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

By: lew
Founder Jusci's WriterMEconomics Android
on 17 January 2024 - 15:43 #1303681 Reply to:1303676
lew's picture

PostgreSQL นี่ upgrade ข้าม major มาหลายรอบ นิ่งมากๆ นะครับ จำไม่ได้เลยว่าเคยเจอปัญหา


lewcpe.com , @wasonliw

By: veer
Windows Phone Ubuntu
on 17 January 2024 - 15:52 #1303682 Reply to:1303676
veer's picture

ไม่ว่าซอฟต์แวร์อะไรก็ไม่ควรอัปเกรดข้าม Major Version

ถูกครับ แต่ไม่ควรใช้ซอฟต์แวร์ที่ end of life ด้วยและ MongoDB 2.X หมดอายุไปตั้งแต่ค.ศ. 2018

ต้องมาเช็กทุกอย่างว่ามีอะไรเปลี่ยนไปบ้าง

PostgreSQL ทำได้ดีหรืออย่างอย่างน้อยก็พอใช้ได้ครับ ทั้งเอกสารและ migration tool ภาษา SQL เองส่วนมากก็ backward compatible ด้วยครับ

By: big50000
Android SUSE Ubuntu
on 17 January 2024 - 17:32 #1303688 Reply to:1303676
big50000's picture

รวบเม้นทั้งสองท่านมาตอบตรงนี้ หลักการ SemVer มันยังทำงานเหมือนเดิม เพียงแต่ว่าเจ้าของซอฟต์แวร์เลือกที่จะตามหรือไม่ก็ได้ ซึ่ง MongoDB เห็นได้ชัดเลยว่าไม่ทำตาม (แอบขอบคุณด้วยที่เตือนล่วงหน้า) ส่วนตัวผมก็ไม่เคยใช้ ผมเคยใช้เฉพาะบริการที่ใช้งานง่าย ๆ และ API ไม่ได้เปลี่ยนเยอะ

และในโลกอุดมคติผมก็เห็นด้วยมาก ๆ เคยไปเถียงอยู่รอบหนึ่งกับเกมเอนจิน Open-source บางเจ้าที่พังแม้กระทั่ง Minor Version เป็นประจำ (ให้ทาย) ก็เถียงอยู่นั่นแหละว่าหลักการ SemVer เราจะ Break Compat ยังไงก็ได้ แต่มันก็ควรจะมีแผน Migration ที่ดีก่อนข้ามเวอร์ชันไหม ไม่ใช่อยากจะทำอะไรก็ทำ คิดแล้วก็โมโหขึ้นมา 55555

By: lew
Founder Jusci's WriterMEconomics Android
on 17 January 2024 - 23:27 #1303708 Reply to:1303688
lew's picture

ตอบในแง่ SemVar โดยรวมๆ ผมมองว่าแนวทาง SemVar นี่หมดความหมายไปเยอะแล้วครับ trend การรักษาความเข้ากันได้ทุกๆ minor แล้วรอ major version ค่อยปล่อยอะไรที่ break backward compatibility นี่มันสร้างปัญหามาก ที่เห็นได้ชัดคือ Python 2 -> 3

ถ้าตามกระแสเราจะเห็นว่าทุกคน "ช่างแม่ง" กับ SemVar กันเยอะแล้ว ด้วยการปล่อยให้ทุก release เป็น major เช่น เลขเวอร์ชั่นเบราว์เซอร์ที่เป็นร้อยแล้ว หรือเวอร์ชั่น nodejs ก็วิ่งเร็วกันสนุกสนานทีเดียว ต่อท้ายด้วย Python ที่เริ่ม break backward ด้วยการถอด standard lib ทิ้ง แม้จะไม่เปลี่ยนเลข major (แต่เอาเข้าจริงมันก็กระทบน้อยมากๆ)


lewcpe.com , @wasonliw

By: btoy
Contributor Android Windows
on 18 January 2024 - 09:01 #1303724 Reply to:1303708
btoy's picture

ผมเห็นด้วยนะครับว่าเดี๋ยวนี้การทำ breaking changes ในฝั่ง libs ใน minor release แทบจะเป็นเรื่องปกติไปแล้ว โดยเฉพาะกับตัวที่มีคนใช้น้อยๆ (เพราะคนกลุ่มนี้ ไม่ตามกลับไปอัพเดตกันเท่าไหร่)

เหมือนกับทีมพัฒนา lib เลือกที่จะพัฒนาฟีเจอร์ใหม่ๆแล้วปล่อยเลย (บางทีก็เหมือนกับต้องพัฒนาแข่งกับ lib คู่แข่ง) แทนที่จะรอ major หน้าเพื่อคง backward compatible เอาไว้

ขณะเดียวกัน dev ฝั่ง app ก็เหมือนพยัคหน้ารู้กันแล้วว่าฝั่ง lib มันเปลี่ยนได้ตลอด ถ้าตัวไหนที่ต้องอัพเดทบ่อยๆ อาจจะต้อง design ให้รองรับการอัพเกรดบ่อยๆ


..: เรื่อยไป

By: veer
Windows Phone Ubuntu
on 18 January 2024 - 14:39 #1303778 Reply to:1303688
veer's picture

ซึ่ง MongoDB เห็นได้ชัดเลยว่าไม่ทำตาม

ผมไม่แน่ใจว่า MongoDB ทำตาม semvar หรือไม่นะครับ เพราะว่าผมก็อัปข้าม version หลักจริง ๆ ซึ่งจะมี breaking change ผมก็ไม่ได้ตำหนิอะไร แต่พอใช้ไปหลาย ๆ ปีก็มันจะมีความจำเป็นลักษณะนี้ขึ้นมาครับ รวมถึงอัป PHP 5 ไป PHP 8 และอื่น ๆ มากมายครับ

ส่วน PostgreSQL ผมประทับใจเป็นพิเศษครับ ไม่เคยเจอว่าต้องมาแก้ query ส่วน extension จะแก้บ้างก็ไม่ว่ากัน

By: rattananen
Android Windows
on 17 January 2024 - 13:35 #1303658 Reply to:1303633

ที่ผมเจอคือ เวลาจะเพิ่ม/แก้ไข field ใน json schema มันจะต้อง run script/sql update ทุก rowยิ่งถ้า field ของ json มี relation นี้ยิ่งลำบาก

ถ้าใช้ table primitive data (int, string, date, decimal, ...) field ทั่วไปนี้ง่ายกว่า, เร็วกว่าเยอะ

เวลาผมออกแบบผมคำนึงถึงว่ามันต้องแก้ไขง่ายก่อนอันดับแรกบางที requirement จาก user ตอนแรก บอกไม่แก้ๆ สุดท้ายก็เปลี่ยนใจแก้อยู่ดี

By: btoy
Contributor Android Windows
on 17 January 2024 - 14:05 #1303663 Reply to:1303658
btoy's picture

ยิ่งถ้า field ของ json มี relation นี้ยิ่งลำบาก

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


..: เรื่อยไป

By: veer
Windows Phone Ubuntu
on 17 January 2024 - 14:07 #1303664 Reply to:1303658
veer's picture

ยิ่งถ้า field ของ json มี relation นี้ยิ่งลำบาก

อันนี้สยองเลย o_O

By: waroonh
Windows
on 17 January 2024 - 14:30 #1303668 Reply to:1303633

บ่อยครับ ประชุมตูม... ฟันมาว่าไป NoSQL ซักตัว แต่ไม่รู้ว่าทำไม ? นี่แหละจุดเริ่มต้นแห่งความสนุกได้เริ่มต้นแล้ว

ที่เคยเห็นใช้แล้วจบนะครับ คือ ใช้เป็น บิล หรือ ticket ที่ต้อง insert วันละเยอะ ๆ สำคัญแค่ ช่วงเวลาหนึ่งหลังจากนั้นลง archive แล้ว data ใน rows จะไม่เปลี่ยนเลย ถ้าเปลี่ยนคือ cancel ใบเก่า สร้างใบใหม่

แก้โครงสร้าง JSON (ของทุก Rows)
...
...
อาจจะเป็นไปได้ว่า มี business key นะ แต่ดันอยู่ใน JSON
เจอแบบนี้ ตัวใครตัวมันนะครับ เหอะๆ

By: veer
Windows Phone Ubuntu
on 17 January 2024 - 15:13 #1303673 Reply to:1303668
veer's picture

ticket ในกรณีข้างในเป็น tree ที่ reply กันไปมาด้วยหรือเปล่าครับ หรือว่าเป็น list ของ comment ต่อกันไปเรื่อย ?

By: jingz on 17 January 2024 - 10:30 #1303626

<3

By: btoy
Contributor Android Windows
on 17 January 2024 - 10:57 #1303628
btoy's picture

ผมเองชอบ PostgreSQL และพอจะเข้าใจว่าทำมันถึงได้รับความนิยม การผสมผสานระหว่างข้อมูลแบบมี schema กับ non-schema ได้ ช่วยลดงานในการอัพเดท data บางอย่างได้เยอะจริงๆ

แต่การออกแบบ Database ก็ยังคิดในรูปแบบที่ว่าข้อมูลหลักๆต้องพยายามให้เป็น SQL ปกติไว้ก่อน


..: เรื่อยไป