ฐานข้อมูลมักคงอยู่นานหลายทศวรรษในขณะที่แอปถูกเขียนใหม่ ทำความเข้าใจว่าทำไมข้อมูลจึงคงอยู่ การย้ายข้อมูลมีค่าใช้จ่ายอย่างไร และวิธีออกแบบสคีมาให้วิวัฒนาการอย่างปลอดภัย

ถ้าคุณทำงานกับซอฟต์แวร์มาสักพัก คุณคงเห็นเรื่องเดิมเกิดซ้ำ: แอปถูกออกแบบใหม่ เขียนใหม่ เปลี่ยนแบรนด์ หรือแทนที่ทั้งหมด ในขณะที่ฐานข้อมูลก็ยังคงทำงานเงียบๆ ต่อไป
บริษัทหนึ่งอาจย้ายจากแอปเดสก์ท็อปไปสู่เว็บ แล้วไปมือถือ แล้วเป็น “v2” ที่สร้างด้วยเฟรมเวิร์กใหม่ แต่บันทึกลูกค้า คำสั่งซื้อ ใบแจ้งหนี้ และแค็ตตาล็อกสินค้ามักยังคงอยู่ในฐานข้อมูลชุดเดิม (หรือรุ่นสืบทอดของมัน) บ่อยครั้งมีตารางที่สร้างมาตั้งแต่สิบปีก่อน
พูดง่ายๆ: โค้ดแอปคืออินเทอร์เฟซและพฤติกรรม ซึ่งเปลี่ยนบ่อยเพราะเปลี่ยนง่ายกว่า ส่วน ฐานข้อมูลคือความทรงจำ และการเปลี่ยนแปลงมันเสี่ยงเพราะมันเก็บประวัติที่ธุรกิจพึ่งพา
ตัวอย่างไม่เชิงเทคนิค: คุณสามารถปรับปรุงร้าน — ชั้นวางใหม่ เคาน์เตอร์ใหม่ ป้ายใหม่ — โดยไม่ต้องทิ้งบันทึกสต็อกและใบเสร็จ การปรับปรุงคือแอป ส่วนบันทึกคือฐานข้อมูล
เมื่อคุณสังเกตแพทเทิร์นนี้ มันจะเปลี่ยนวิธีตัดสินใจของคุณ:
ในส่วนถัดไป คุณจะได้เรียนรู้ว่าทำไมฐานข้อมูลถึงมักคงอยู่ เหตุใดการย้ายข้อมูลจึงยากกว่าการเปลี่ยนโค้ด และวิธีปฏิบัติที่เป็นประโยชน์เพื่อออกแบบและดูแลฐานข้อมูลให้รอดจากการเขียนแอปใหม่หลายครั้ง — โดยไม่เปลี่ยนทุกการแก้ไขให้กลายเป็นวิกฤต
แอปดูเหมือนเป็น “ผลิตภัณฑ์” แต่ฐานข้อมูลต่างหากที่เก็บความทรงจำของผลิตภัณฑ์
แอปร้านค้าอาจถูกออกแบบใหม่ห้ารอบ แต่ลูกค้ายังคาดหวังว่าประวัติการซื้อของพวกเขาจะยังอยู่ พอร์ทัลสนับสนุนอาจเปลี่ยนผู้ให้บริการ แต่บันทึกตั๋ว คืนเงิน และคำสัญญาที่เคยให้ต้องคงอยู่ต่อ ความต่อเนื่องนั้นอยู่ในข้อมูลที่เก็บ: ลูกค้า คำสั่งซื้อ ใบแจ้งหนี้ การสมัคร เหตุการณ์ และความสัมพันธ์ระหว่างสิ่งเหล่านี้
ถ้าฟีเจอร์หาย ผู้ใช้ก็ไม่พอใจ แต่ถ้าข้อมูลหาย คุณอาจเสียความเชื่อถือ รายได้ และฐานะทางกฎหมาย
แอปมักถูกสร้างใหม่จาก source control และเอกสารได้ แต่ประวัติจริงของโลกไม่สามารถสร้างซ้ำได้ คุณไม่สามารถ "รันอีกครั้ง" การจ่ายเงินของปีที่แล้ว หรือสร้างการยินยอมของลูกค้า ณ เวลาที่ให้ได้ หรือสร้างให้ตรงว่าของอะไรถูกส่งและเมื่อไหร่จากความทรงจำได้ แม้การสูญเสียบางส่วน — ขาด timestamp แถวถูกทอดทิ้ง ยอดรวมไม่สอดคล้อง — ก็ทำให้ผลิตภัณฑ์ดูไม่น่าเชื่อถือ
ข้อมูลส่วนใหญ่มีประโยชน์มากขึ้นยิ่งนานขึ้น:
นี่คือเหตุผลที่ทีมปฏิบัติต่อข้อมูลเป็นทรัพย์สิน ไม่ใช่ผลพลอยได้จากฟีเจอร์ การเขียนแอปใหม่อาจให้ UI ที่ดีขึ้น แต่แทบไม่เคยทดแทนความจริงในเชิงประวัติศาสตร์ที่สั่งสมมาหลายปีได้
เมื่อเวลาผ่านไป องค์กรค่อยๆ มาตรฐานใช้งานฐานข้อมูลเป็นจุดอ้างอิงร่วม: สเปรดชีตที่ส่งออกจากมัน แดชบอร์ดที่สร้างบนมัน กระบวนการการเงินที่กระทบยอดกับมัน และคำสั่ง SQL ที่ถือว่า "รู้ว่าถูก" ใช้ตอบคำถามซ้ำๆ
นั่นคือหัวใจทางอารมณ์ของความยั่งยืนของฐานข้อมูล: มันกลายเป็นความทรงจำที่ทุกคนพึ่งพา — แม้แอปโดยรอบจะเปลี่ยนไปเรื่อยๆ
ฐานข้อมูลไม่ค่อยถูก "เป็นเจ้าของ" โดยแอปเพียงตัวเดียว เมื่อเวลาผ่านไป มันกลายเป็นแหล่งความจริงร่วมสำหรับหลายผลิตภัณฑ์ เครื่องมือภายใน และทีม การพึ่งพาร่วมนี้เป็นเหตุผลสำคัญที่ฐานข้อมูลยังคงอยู่ ขณะที่โค้ดแอปถูกแทนที่
โดยทั่วไปชุดตารางเดียวกันอาจให้บริการ:
ผู้บริโภคแต่ละอันอาจเขียนด้วยภาษาแตกต่าง ปล่อยเวอร์ชันตามตารางเวลาแตกต่าง และดูแลโดยคนต่างกัน เมื่อต้องเขียนแอปใหม่ มันปรับโค้ดตัวเองได้เร็ว — แต่ยังต้องอ่านและเก็บบันทึกเดียวกันที่คนอื่นพึ่งพา
การผสานมัก "ผูก" กับโมเดลข้อมูลเฉพาะ: ชื่อตาราง ความหมายของคอลัมน์ รหัสอ้างอิง และสมมติฐานเกี่ยวกับสิ่งที่เป็นระเบียน แม้การผสานจะผ่าน API เท่านั้น API มักสะท้อนโมเดลฐานข้อมูลข้างใต้
นั่นคือเหตุผลที่การเปลี่ยนฐานข้อมูลไม่ใช่การตัดสินใจของทีมเดียว การเปลี่ยนสคีมาอาจกระทบถึงการส่งออก งาน ETL คิวรีรายงาน และระบบปลายน้ำที่ไม่ได้อยู่ใน repo หลักด้วย
ถ้าคุณปล่อยฟีเจอร์บั๊ก คุณมักจะย้อนกลับได้ หากคุณทำลายสัญญาร่วมของฐานข้อมูล คุณอาจขัดจังหวะการเรียกเก็บเงิน แดชบอร์ด และการรายงานพร้อมกัน ความเสี่ยงทวีคูณตามจำนวนผู้พึ่งพา
นี่คือเหตุผลที่การตัดสินใจ "ชั่วคราว" (ชื่อตาราง ค่าของ enum ความหมายแปลกๆ ของ NULL) กลายเป็นขัดยึด: มีหลายสิ่งที่เงียบๆ พึ่งพาพวกมัน
ถ้าคุณต้องการกลยุทธ์ปฏิบัติสำหรับการจัดการอย่างปลอดภัย ดู /blog/schema-evolution-guide
การเขียนโค้ดแอปใหม่มักทำเป็นชิ้นเล็กๆ ได้ คุณสามารถเปลี่ยน UI แทนที่เซอร์วิส หรือสร้างฟีเจอร์ใหม่หลัง API ขณะที่ยังคงฐานข้อมูลเดิม หากเกิดปัญหาคุณสามารถย้อนการปรับใช้ สลับทราฟฟิคกลับไปยังโมดูลเก่า หรือรันโค้ดเก่าและใหม่พร้อมกันได้
ข้อมูลไม่มีความยืดหยุ่นแบบนั้น ข้อมูลถูกแชร์ เชื่อมโยง และมักคาดหวังว่าจะถูกต้องทุกวินาที — ไม่ใช่ "ถูกต้องส่วนใหญ่หลัง deploy ครั้งถัดไป"
เมื่อคุณ refactor โค้ด คุณแค่เปลี่ยนคำสั่ง เมื่อต้องย้ายข้อมูล คุณเปลี่ยนสิ่งที่ธุรกิจพึ่งพา: ระเบียนลูกค้า ธุรกรรม เส้นทางการตรวจสอบ ประวัติสินค้า
เซอร์วิสใหม่สามารถทดสอบกับผู้ใช้ชุดย่อยได้ แต่การย้ายฐานข้อมูลกระทบทุกอย่าง: ผู้ใช้ปัจจุบัน ผู้ใช้เก่า แถวประวัติ แถวที่ถูกทอดทิ้ง และรายการหนึ่งครั้งที่เกิดจากบั๊กเมื่อสามปีก่อน
การย้ายข้อมูลไม่ใช่แค่ "ส่งออกแล้วนำเข้า" มักรวมถึง:
แต่ละขั้นตอนต้องการการยืนยัน และการยืนยันใช้เวลา — โดยเฉพาะเมื่อชุดข้อมูลใหญ่และผลกระทบของข้อผิดพลาดสูง
การปรับใช้โค้ดทำได้บ่อยและย้อนกลับได้ง่าย การตัดข้ามข้อมูลเหมือนการผ่าตัด
หากคุณต้องการ downtime คุณกำลังประสานงานกับการปฏิบัติการ ธุรกิจ และการคาดหวังลูกค้า หากเป้าหมายคือ near-zero downtime คุณอาจทำ dual-writes, change data capture, หรือ replication แบบวางแผนอย่างระมัดระวัง — พร้อมแผนเมื่อระบบใหม่ช้าหรือผิดพลาด
การย้อนกลับก็แตกต่าง การย้อนกลับโค้ดง่าย การย้อนกลับข้อมูลมักหมายถึงการกู้คืนแบ็กอัพ เล่นซ้ำการเปลี่ยนแปลง หรือยอมรับว่ามีการเขียนบางอย่างไปผิดที่และต้องไกล่เกลี่ย
ฐานข้อมูลสะสมประวัติ: แถวแปลกๆ สถานะมรดก แถวที่ย้ายไม่สมบูรณ์ และวิธีแก้ปัญหาที่ไม่มีใครจำ เคสเหล่านี้แทบไม่ปรากฏในชุดข้อมูลพัฒนา แต่จะแสดงขึ้นทันทีระหว่างการย้ายจริง
นั่นคือเหตุผลที่องค์กรมักยอมเขียนโค้ดใหม่ซ้ำๆ ขณะที่คงฐานข้อมูลไว้ ฐานข้อมูลไม่ใช่แค่การพึ่งพา — มันเป็นสิ่งที่ยากที่สุดที่จะเปลี่ยนโดยปลอดภัย
การเปลี่ยนโค้ดแอปเกี่ยวกับการปล่อยพฤติกรรมใหม่ หากเกิดปัญหาคุณย้อนกลับ ปิดฟีเจอร์ หรือแพตช์ได้อย่างรวดเร็ว
การเปลี่ยนสคีมาแตกต่าง: มันเปลี่ยนกฎสำหรับข้อมูลที่มีอยู่แล้ว และข้อมูลนั้นอาจเก่า ไม่สอดคล้อง หรือพึ่งพาโดยหลายบริการและรายงาน
สคีมาที่ดีไม่ค่อยคงที่ ความท้าทายคือพัฒนาให้รักษาข้อมูลประวัติให้ถูกต้องและใช้งานได้ ต่างจากโค้ด ข้อมูลไม่สามารถ "คอมไพล์" เป็นสถานะสะอาดใหม่ — คุณต้องพาข้อมูลทุกแถวเดินหน้าต่อ รวมถึงเคสพิเศษที่ไม่มีใครจำ
นี่คือเหตุผลที่วิวัฒนาการสคีมามักเอื้อต่อการเปลี่ยนที่รักษาความหมายเดิมและหลีกเลี่ยงการบังคับให้เขียนข้อมูลใหม่ทั้งหมด
การเปลี่ยนแบบเพิ่ม (ตารางใหม่ คอลัมน์ใหม่ ดัชนีใหม่) มักทำให้โค้ดเก่ายังคงทำงานได้ ขณะที่โค้ดใหม่ใช้โครงสร้างใหม่ได้
การเปลี่ยนที่ทำลาย — เปลี่ยนชื่อคอลัมน์ เปลี่ยนชนิด แยกฟิลด์เป็นหลายฟิลด์ เข้มข้อจำกัด — มักต้องการการปรับปรุงประสานงานข้าม:
แม้คุณจะอัปเดตแอปหลัก รายงานหรือการผสานที่ถูกลืมอาจยังคงพึ่งพารูปร่างเดิมอย่างเงียบๆ
"แค่อัปเดตสคีมา" ฟังดูง่ายจนกว่าจะต้องย้ายแถวหลายล้านแถวพร้อมกันโดยยังให้ระบบออนไลน์ คุณต้องคิดเกี่ยวกับ:
NOT NULL ใหม่ALTER operationsในหลายกรณี คุณจะทำการย้ายหลายขั้นตอน: เพิ่มฟิลด์ใหม่ เขียนทั้งสองที่ เติมข้อมูลย้อนหลัง สลับการอ่าน แล้วค่อยเก็บฟิลด์เก่าในภายหลัง
การเปลี่ยนโค้ดย้อนกลับได้และแยกส่วนได้; การเปลี่ยนสคีมาถาวรและถูกแชร์ เมื่อมิเกรชันรันมันกลายเป็นส่วนหนึ่งของประวัติฐานข้อมูล — และทุกเวอร์ชันในอนาคตต้องอยู่กับการตัดสินใจนั้น
เฟรมเวิร์กแอปเปลี่ยนเร็ว: สิ่งที่ดูทันสมัยเมื่อห้าปีที่แล้วอาจไม่มีคนใช้หรือหาคนจ้างยากวันนี้ ฐานข้อมูลก็เปลี่ยนเช่นกัน แต่แนวคิดหลักและทักษะประจำวันเปลี่ยนช้ากว่า
SQL และแนวคิดเชิงสัมพันธ์คงตัวเป็นเวลาหลายสิบปี: ตาราง joins ข้อจำกัด ดัชนี ธุรกรรม และแผนคิวรี ผู้ขายเพิ่มฟีเจอร์ แต่โมเดลความคิดยังคงคุ้นเคย ความเสถียรนี้ทำให้ทีมสามารถเขียนแอปใหม่ด้วยภาษาใหม่แล้วยังคงโมเดลข้อมูลและแนวทางคิวรีเดิมได้
แม้ผลิตภัณฑ์ฐานข้อมูลใหม่มักอนุบาลเลเยอร์คิวรีที่คล้าย SQL หรือการ join แบบเชิงสัมพันธ์ เพราะมันเหมาะกับการรายงาน การแก้ปัญหา และคำถามทางธุรกิจ
เพราะพื้นฐานคงที่ ระบบนิเวศโดยรอบจึงคงอยู่ข้ามยุค:
ความต่อเนื่องนี้ลดความจำเป็นต้องเขียนใหม่จากต้นทุนการบีบหลอก บริษัทอาจละทิ้งเฟรมเวิร์กแอปเพราะหาคนไม่เจอหรือแพตช์ไม่ออก แต่ไม่ค่อยทิ้ง SQL ในฐานะภาษากลางของข้อมูล
มาตรฐานและคอนเวนชันของฐานข้อมูลสร้างฐานร่วม: ไดอะเล็กต์ SQL ต่างกัน แต่ใกล้เคียงกันกว่ากับเฟรมเวิร์กเว็บส่วนใหญ่ นั่นทำให้ง่ายขึ้นที่จะรักษาฐานข้อมูลขณะเลเยอร์แอปวิวัฒนาการ
ผลเชิงปฏิบัติคือ: เมื่อทีมวางแผนเขียนแอปใหม่ พวกเขามักรักษาทักษะฐานข้อมูล เดิม แพตเทิร์นคิวรี และแนวปฏิบัติการปฏิบัติ — ทำให้ฐานข้อมูลเป็นรากฐานที่มั่นคงยาวนานกว่ารหัสหลายรุ่น
ทีมส่วนใหญ่ไม่อยู่กับฐานข้อมูลเดิมเพราะชอบ แต่เพราะพวกเขาสร้างนิสัยการปฏิบัติการที่ใช้ได้ — และนิสัยเหล่านั้นได้มาด้วยความยาก
เมื่อฐานข้อมูลขึ้นสู่ production มันกลายเป็นเครื่องจักร "always-on" ของบริษัท เป็นสิ่งที่คนจะโทรแจ้งตอนตีสอง สิ่งที่การตรวจสอบถามหา และสิ่งที่ทุกบริการใหม่ต้องสื่อสารด้วย
หลังหนึ่งถึงสองปี ทีมมักมีจังหวะที่เชื่อถือได้:
การเปลี่ยนฐานข้อมูลหมายถึงการเรียนรู้ทั้งหมดนั้นใหม่ภายใต้โหลดจริงและความคาดหวังของลูกค้าจริง
ฐานข้อมูลไม่ค่อยเป็น "ตั้งค่าแล้วลืม" เมื่อเวลาผ่านไปทีมสร้างความรู้ด้านความน่าเชื่อถือ:
ความรู้นั้นมักอยู่ในแดชบอร์ด สคริปต์ และในหัวคน ไม่ได้อยู่ในเอกสารเดียว การเขียนแอปใหม่สามารถรักษาพฤติกรรมได้ ขณะที่ฐานข้อมูลยังคงให้บริการ การแทนที่ฐานข้อมูลจะบังคับให้สร้างพฤติกรรม ประสิทธิภาพ และความน่าเชื่อถือขึ้นใหม่พร้อมกัน
การควบคุมการเข้าถึงและความปลอดภัยเป็นศูนย์กลางและยาวนาน บทบาท สิทธิ์ บันทึกการตรวจสอบ การหมุนความลับ การตั้งค่าการเข้ารหัส และ "ใครอ่านได้อะไร" มักสอดคล้องกับข้อกำหนดการปฏิบัติตามและนโยบายภายใน
การเปลี่ยนฐานข้อมูลหมายถึงการสร้างโมเดลการเข้าถึงใหม่ ตรวจสอบควบคุมใหม่ และพิสูจน์ให้ธุรกิจเห็นว่าข้อมูลที่ละเอียดอ่อนยังคงถูกปกป้อง
วุฒิภาวะการปฏิบัติการลดความเสี่ยง แม้ฐานข้อมูลใหม่สัญญาคุณสมบัติดีกว่า แต่ของเก่ามีสิ่งทรงพลัง: ประวัติที่ขึ้นอยู่ได้ อยู่ในสภาพกู้คืนได้ และเข้าใจได้เมื่อเกิดปัญหา
โค้ดแอปสามารถเปลี่ยนเป็นเฟรมเวิร์กใหม่หรือสถาปัตยกรรมที่สะอาดกว่าได้ ข้อกำหนดการปฏิบัติตาม แต่ว่าผูกกับระเบียน — เกิดอะไรขึ้น เมื่อไหร่ ใครอนุมัติ และลูกค้าเห็นอะไรในขณะนั้น นั่นคือเหตุผลที่ฐานข้อมูลมักเป็นวัตถุที่ยากจะเคลื่อนเมื่อต้องเขียนใหม่
หลายอุตสาหกรรมมีกำหนดระยะเวลาการเก็บรักษาขั้นต่ำสำหรับใบแจ้งหนี้ บันทึกการยินยอม เหตุการณ์การเงิน การสนับสนุน และล็อกการเข้าถึง ผู้ตรวจสอบไม่ยอมรับแค่คำว่า "เราเขียนแอปใหม่" เป็นเหตุผลให้ประวัติหาย
แม้ทีมจะไม่ใช้ตารางมรดกในงานประจำวัน คุณอาจถูกขอให้แสดงมันและอธิบายวิธีสร้างมัน
การเรียกเก็บเงินย้อนหลัง การคืนเงิน ข้อพิพาทการส่งมอบ และคำถามสัญญาพึ่งพาสแนปชอตประวัติ: ราคาตอนนั้น ที่อยู่ที่ใช้ ข้อตกลงที่ยอมรับ หรือสถานะในนาทีที่ระบุ
เมื่อฐานข้อมูลเป็นแหล่งอ้างอิงข้อเท็จจริง การแทนที่มันไม่ใช่แค่โครงการเทคนิค — มันเสี่ยงต่อการเปลี่ยนหลักฐาน นั่นคือเหตุผลที่ทีมมักเก็บฐานข้อมูลเดิมแล้วสร้างเซอร์วิสใหม่รอบๆ มัน แทนที่จะ "ย้ายและหวังว่ามันตรงกัน"
บางระเบียนลบไม่ได้ บางระเบียนไม่สามารถแปลงในทางที่ทำลายการติดตามได้ หากคุณทำ denormalize รวมฟิลด์ หรือดรอปคอลัมน์ คุณอาจสูญเสียความสามารถในการสร้างเส้นทางตรวจสอบกลับ
ความตึงเครียดนี้ชัดเมื่อข้อกำหนดความเป็นส่วนตัวปะทะกับการเก็บรักษา: อาจต้องการการเซนเซอร์แบบคัดเลือกหรือการทำ pseudonymization ขณะที่ยังคงเก็บประวัติการทำธุรกรรม ข้อจำกัดเหล่านี้มักอยู่ใกล้ข้อมูลมากที่สุด
การจัดประเภทข้อมูล (PII การเงิน สุขภาพ ภายในเท่านั้น) และนโยบายการกำกับดูแลมักคงที่แม้ผลิตภัณฑ์เปลี่ยน สัญญาการเข้าถึง นิยามรายงาน และการตัดสินใจ "แหล่งความจริงเดียว" ถูกบังคับใช้ในระดับฐานข้อมูลเพราะมันถูกใช้โดยเครื่องมือหลายชิ้น: แดชบอร์ด BI การส่งออกการเงิน รายงานต่อหน่วยงาน และการสอบสวนเหตุการณ์
หากคุณวางแผนเขียนใหม่ ให้ถือการรายงานการปฏิบัติตามเป็นข้อกำหนดอันดับหนึ่ง: ทำ inventory รายงานที่ต้องการ กำหนดการเก็บรักษา และฟิลด์ตรวจสอบก่อนแตะสคีมา เช็คลิสต์ง่ายๆ จะช่วยได้ (ดู /blog/database-migration-checklist)
การตัดสินใจฐานข้อมูลส่วนใหญ่ที่เป็น "ชั่วคราว" ไม่ได้ทำแบบไม่รอบคอบ — มักทำภายใต้แรงกดดัน: กำหนดการเปิดตัว คำขอจากลูกค้าที่เร่งด่วน กฎระเบียบใหม่ หรือนำเข้าข้อมูลที่ยุ่งเหยิง สิ่งที่น่าแปลกใจคือความไม่บ่อยครั้งที่การตัดสินใจเหล่านั้นถูกยกเลิก
โค้ดแอปสามารถ refactor ได้เร็ว แต่ฐานข้อมูลต้องคอยให้บริการผู้บริโภคเก่าและใหม่พร้อมกัน ตารางและคอลัมน์มรดกคงอยู่เพราะยังมีบางสิ่งพึ่งพามัน:
แม้คุณจะ "เปลี่ยนชื่อ" ฟิลด์ บ่อยครั้งคุณก็ต้องเก็บฟิลด์เก่าไว้ด้วย รูปแบบทั่วไปคือเพิ่มคอลัมน์ใหม่ (เช่น customer_phone_e164) ในขณะที่ทิ้ง phone ไว้เพราะการส่งออกรายวันยังใช้มัน
วิธีแก้ปัญหาเข้ามาอยู่ในสเปรดชีต แดชบอร์ด และ CSV — ที่ที่มักไม่ถูกปฏิบัติเหมือนโค้ด production ใครสักคนสร้างรายงานรายได้ที่ join ตารางที่เลิกใช้ "ชั่วคราวจนกว่า Finance จะย้าย" แล้วกระบวนการไตรมาสของ Finance กลายเป็นพึ่งพามัน การลบตารางนั้นจึงเสี่ยงต่อกระบวนการทางธุรกิจ
นี่คือเหตุผลที่ตารางที่เลิกใช้สามารถอยู่ได้นานเป็นปี: ฐานข้อมูลไม่เพียงแต่ให้บริการแอป แต่ยังให้บริการนิสัยขององค์กร
ฟิลด์ที่เพิ่มเพื่อแก้ปัญหาเร็วๆ เช่น promo_code_notes legacy_status manual_override_reason มักกลายเป็นจุดตัดสินใจในเวิร์กโฟลว์ เมื่้อผู้คนใช้มันเพื่ออธิบายผลลัพธ์ ("อนุมัติคำสั่งเพราะ...") มันไม่ใช่ตัวเลือกอีกต่อไป
เมื่อทีมไม่ไว้วางใจการย้าย พวกเขามักเก็บสำเนาเงา: ชื่อผู้ใช้ซ้ำ ยอดรวมแคช หรือธงสำรอง คอลัมน์เสริมหรือสำเนาเหล่านี้ดูเป็นกลาง แต่สร้างแหล่งความจริงที่แข่งขันกัน — และพึ่งพาใหม่ๆ
ถ้าคุณอยากหลีกเลี่ยงกับดักนี้ ให้ปฏิบัติการเปลี่ยนสคีมาเหมือนการเปลี่ยนผลิตภัณฑ์: บันทึกเจตนา กำหนดวันที่เลิกใช้ และติดตามผู้บริโภคก่อนลบอะไร
สำหรับเช็คลิสต์ปฏิบัติ ดู /blog/schema-evolution-checklist
ฐานข้อมูลที่รอดจากหลายรุ่นของแอปต้องได้รับการปฏิบัติเหมือนโครงสร้างพื้นฐานร่วมมากกว่าส่วนการใช้งานภายใน เป้าหมายไม่ใช่คาดการณ์ฟีเจอร์ทุกอย่างในอนาคต — แต่ทำให้การเปลี่ยนแปลงปลอดภัย ค่อยเป็นค่อยไป และย้อนกลับได้
โค้ดแอปอาจถูกเขียนใหม่ แต่สัญญาข้อมูลต่อรองยาก คิดถึงตาราง คอลัมน์ และความสัมพันธ์เป็น API ที่ระบบอื่น (และทีมในอนาคต) จะพึ่งพา
ชอบการเปลี่ยนแบบ เพิ่ม:
การเขียนแอปในอนาคตมักล้มเหลวไม่ใช่เพราะข้อมูลหาย แต่เพราะความกำกวม
ใช้การตั้งชื่อที่ชัดเจนและสื่อเจตนา (เช่น billing_address_id vs addr2) สนับสนุนด้วยข้อจำกัดที่เข้ารหัสกฎเมื่อเป็นไปได้: primary keys, foreign keys, NOT NULL, uniqueness, check constraints
เพิ่มเอกสารจางๆ ใกล้สคีมา — คอมเมนต์บนตาราง/คอลัมน์ หรือเอกสารสั้นที่อัพเดตได้ในฮันดบุ๊กภายใน "ทำไม" สำคัญเท่ากับ "อะไร"
การเปลี่ยนแต่ละครั้งควรมีเส้นทางไปข้างหน้าและเส้นทางถอยกลับ
วิธีหนึ่งที่ปฏิบัติได้คือฝัง "โหมดวางแผน" และวินัยการย้อนกลับในเวิร์กโฟลว์การส่งมอบ ตัวอย่างเช่น เมื่อทีมสร้างเครื่องมือภายในหรือเวอร์ชันแอปใหม่บน Koder.ai พวกเขาสามารถทำซ้ำผ่านแชทได้ ในขณะที่ยังปฏิบัติต่อสคีมาเป็นสัญญาที่มั่นคง — ใช้สแนปชอตและแนวปฏิบัติการย้อนกลับเพื่อลดผลกระทบจากการเปลี่ยนโดยไม่ตั้งใจ
ถ้าคุณออกแบบฐานข้อมูลโดยสัญญาที่มั่นคงและวิวัฒนาการที่ปลอดภัย การเขียนแอปใหม่จะเป็นเหตุการณ์ปกติ ไม่ใช่ภารกิจกู้ข้อมูลที่เสี่ยง
การแทนที่ฐานข้อมูลไม่บ่อย แต่ไม่ใช่เรื่องในนิยาย ทีมที่ทำได้ไม่ใช่ "กล้าหาญกว่า" — พวกเขาเตรียมตัวล่วงหน้าหลายปีโดยทำให้ข้อมูลพกพาได้ ทำให้การพึ่งพาเห็นได้ และแยกแอปให้ไม่ผูกติดกับเอ็นจินเดียว
เริ่มด้วยการถือการส่งออกเป็นความสามารถอันดับหนึ่ง ไม่ใช่สคริปต์ครั้งเดียว
การผูกแน่นทำให้การย้ายกลายเป็นการเขียนใหม่
มุ่งสู่แนวทางสมดุล:
ถ้าคุณกำลังสร้างเซอร์วิสใหม่เร็วๆ (เช่น React admin app บวก Go backend กับ PostgreSQL) การเลือกสแต็กที่เอื้อต่อความพกพาและความชัดเจนในการปฏิบัติการจะช่วย Koder.ai เน้น primitive ที่ยอมรับกันแพร่หลาย และรองรับการส่งออกซอร์สโค้ด — มีประโยชน์เมื่อคุณต้องการให้เลเยอร์แอปแทนที่ได้โดยไม่ล็อกโมเดลข้อมูล
ฐานข้อมูลมักจ่ายพลังให้มากกว่าแอปหลัก: รายงาน สเปรดชีต งาน ETL ตามเวลา การผสานบุคคลที่สาม และท่อสอบสวน
รักษา inventory ที่อัพเดต: ใครอ่าน/เขียน อะไรบ้าง บ่อยแค่ไหน และจะเกิดอะไรถ้ามันพัง แม้เพจง่ายๆ ใน /docs พร้อมเจ้าของและจุดติดต่อก็ป้องกันความประหลาดใจได้มาก
สัญญาณทั่วไป: ข้อจำกัดไลเซนส์หรือโฮสติ้ง ปัญหาความน่าเชื่อถือที่แก้ไม่ได้ ขาดคุณสมบัติการปฏิบัติตาม หรือขีดจำกัดสเกลที่ต้องแก้ด้วยทางลัดสุดโต่ง
ความเสี่ยงหลัก: การสูญหายของข้อมูล ความเปลี่ยนแปลงความหมายอย่างละเอียด เวลาหยุดทำงาน และการเบี่ยงเบนรายงาน
แนวทางที่ปลอดภัยมักเป็น การรันคู่: ย้ายข้อมูลอย่างต่อเนื่อง ยืนยันผลลัพธ์ (counts, checksums, metrics ทางธุรกิจ) ค่อยๆ ย้ายทราฟฟิค และเก็บทางย้อนกลับจนกว่าจะมั่นใจสูง
เพราะฐานข้อมูลเก็บความจริงในเชิงประวัติศาสตร์ของธุรกิจ (ลูกค้า คำสั่งซื้อ ใบแจ้งหนี้ บันทึกตรวจสอบ) โค้ดสามารถปรับปรุงหรือเขียนใหม่ได้ แต่ประวัติที่สูญหายหรือเสียหายยากจะสร้างขึ้นใหม่และอาจทำให้เกิดปัญหาทางการเงิน กฎหมาย และความเชื่อถือได้
การเปลี่ยนแปลงข้อมูลมีลักษณะเป็นสิ่งที่แชร์และถาวรกว่า
ฐานข้อมูลชุดเดียวมักกลายเป็นแหล่งความจริงร่วมสำหรับ:
แม้คุณจะเขียนแอปใหม่ ผู้บริโภคเหล่านี้ยังคงต้องการตาราง รหัสอ้างอิง และความหมายที่คงที่
น้อยครั้งที่จะเปลี่ยนแอปโดยไม่แตะฐานข้อมูล ส่วนใหญ่การย้ายจะวางเป็นขั้นตอนเพื่อให้สัญญาของฐานข้อมูลคงที่ขณะที่คอมโพเนนต์ของแอปเปลี่ยน
แนวทางทั่วไป:
ทีมส่วนใหญ่เน้นการเปลี่ยนแบบ เพิ่มไม่ทำลาย:
วิธีนี้ช่วยให้โค้ดเก่าและใหม่ทำงานพร้อมกันระหว่างการเปลี่ยนผ่าน
ความกำกวมมักอยู่ได้นานกว่าจุดประสงค์ของโค้ด
แนวทางปฏิบัติ:
billing_address_id)NOT NULL, ความเป็นเอกลักษณ์, check)การอธิบาย "ทำไม" สำคัญเท่ากับ "อะไร"
คาดว่าจะเจอแถวที่ “แปลก” ได้
ก่อนย้ายข้อมูล วางแผนสำหรับ:
ทดสอบการย้ายกับข้อมูลที่ใกล้เคียงกับ production และใส่ขั้นตอนการยืนยัน ไม่ใช่แค่ตรรกะการแปลง
ข้อกำหนดด้านการปฏิบัติตามกฎระเบียบผูกมัดกับระเบียน ไม่ใช่ UI
คุณอาจต้องเก็บและแสดง:
การเปลี่ยนรูปหรือการลบฟิลด์อาจทำให้การตรวจสอบย้อนกลับ/reporting หรือความสามารถในการพิสูจน์หลักฐานเสียหาย แม้ว่าจะเปลี่ยนแอปไปแล้วก็ตาม
เพราะความเข้ากันได้สร้างการพึ่งพาที่ซ่อนอยู่:
ปฏิบัติการยุติการใช้งานให้เหมือนการเปลี่ยนผลิตภัณฑ์: บันทึกเจตนา ติดตามผู้บริโภค และกำหนดแผนเกษียณ
เช็คลิสต์ปฏิบัติได้จริง:
แนวทางนี้ทำให้การเขียนแอปใหม่เป็นเรื่องปกติ แทนที่จะกลายเป็นภารกิจกู้ข้อมูลที่เสี่ยง