มีวิธีใดบ้างที่จะอนุญาตการกำหนดเวอร์ชันของรายการฐานข้อมูล (ข้อมูล)
คิดถึงความสามารถของระบบการจัดการเนื้อหาเพื่อย้อนกลับการเปลี่ยนแปลงของบทความ
ข้อดี / ข้อเสียของพวกเขาคืออะไร
มีวิธีใดบ้างที่จะอนุญาตการกำหนดเวอร์ชันของรายการฐานข้อมูล (ข้อมูล)
คิดถึงความสามารถของระบบการจัดการเนื้อหาเพื่อย้อนกลับการเปลี่ยนแปลงของบทความ
ข้อดี / ข้อเสียของพวกเขาคืออะไร
คำตอบ:
โดยทั่วไปมีสองวิธีคือ: ตารางการตรวจสอบที่มีค่าก่อนหน้าทั้งหมดที่เก็บไว้ในนั้นหรือรวมถึงวันที่เริ่มต้น / สิ้นสุดเป็นส่วนหนึ่งของตารางและการปรับปรุงทั้งหมดสร้างระเบียนใหม่ในขณะที่ปิดเก่า
อัปเดต: SQL SERVER 2016 รองรับสิ่งนี้เป็นรูปแบบการออกแบบ / พิมพ์ตาราง - https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017
แนวคิดหนึ่งคือการใช้ "ฐานข้อมูลแบบแทรกเท่านั้น" ความคิดพื้นฐานคือการที่คุณไม่เคยลบหรือการปรับปรุงข้อมูลในแถว
ตารางที่จะต้องได้รับการติดตามแต่ละคนจะมีสองdatetime
คอลัมน์และfrom
to
พวกเขาเริ่มต้นด้วยค่าNULL
ในแต่ละ (จุดเริ่มต้นของเวลาจนถึงจุดสิ้นสุด) เมื่อคุณจำเป็นต้อง "เปลี่ยน" แถวที่คุณเพิ่มแถวใหม่และในเวลาเดียวกันคุณอัปเดตto
ในแถวก่อนหน้าNow
และในแถวที่คุณกำลังจะไปเพิ่มfrom
Now
สำหรับข้อมูลเพิ่มเติมดูที่:
เทคนิคนี้เรียกว่าAuditTrail
การจัดการข้อมูลดั้งเดิมและร้านค้าของ kinda เปลี่ยนประวัติศาสตร์
ดูเหมือนว่าคำถามเกี่ยวกับลักษณะนี้ได้โพสต์แล้ว:
ฉันคิดว่าคุณสามารถใช้ทริกเกอร์สำหรับแต่ละตารางและรักษาข้อมูลใน _history (หรือคุณสามารถให้ชื่อใด ๆ ) และทุกครั้งที่แทรกอัปเดตลบบนตารางหลักจะเรียกทริกเกอร์ของคุณและคุณสามารถบันทึกรายละเอียดในตารางนี้กลไกทริกเกอร์ ยังสามารถใช้ได้กับฐานข้อมูล SQLite ถ้าคุณใช้
กลไกนี้มีประโยชน์สำหรับโครงการขนาดใหญ่เช่นกัน ในตารางนี้คุณสามารถบันทึกข้อมูลของผู้ใช้ที่ทำการเปลี่ยนแปลงพร้อมกับการลงเวลาของการเปลี่ยนแปลง จากนั้นคุณสามารถคืนค่าตารางของคุณให้ตรงกับการประทับเวลาใด ๆ กับความต้องการของคุณ
ทุกฐานข้อมูลมีวิธีการเขียนและทริกเกอร์โค้ดของตัวเอง หากคุณใช้ SQLite โปรดเยี่ยมชมSQLite.orgเพื่อดูไวยากรณ์ สำหรับฐานข้อมูลอื่นคุณสามารถเยี่ยมชมเว็บไซต์อย่างเป็นทางการของพวกเขา
คุณอาจทราบถึงเครื่องมือSQL Sqlite db ทั้งหมดถูกบันทึกไว้ในไฟล์เดียว api ยังรองรับระบบไฟล์เสมือนดังนั้นโดยทั่วไปคุณสามารถจัดระเบียบที่เก็บข้อมูลได้ทุกที่และทุกรูปแบบเพียงตอบสนองต่อการอ่านและเขียนในการออฟเซ็ตไฟล์ แอปพลิเคชันที่เป็นไปได้สำหรับสิ่งนี้อาจเป็นการเข้ารหัสการบีบอัดและอื่น ๆ ส่วนที่ดีที่สุดคือเลเยอร์คอนเทนเนอร์ไม่ควรรู้อะไรเกี่ยวกับฐานข้อมูลรูปแบบไฟล์ sql หรือ sqlite เพียงแค่เชื่อฟัง xRead และ xWrite callbacks
หนึ่งในความคิดคือการใช้คุณสมบัติเครื่องเวลา ดังนั้นการดำเนินการ xWrite ใด ๆ จะบันทึกทุกเซ็กเมนต์มันจะเขียนทับในประวัติ "เลิกทำ" และผู้ใช้สามารถเลือกวันที่ในอดีตเพื่อดูว่า db มีอะไรอยู่ (อาจเป็นโหมดอ่านอย่างเดียว) ฉันยังไม่มีตัวอย่างการทำงาน (มีการอภิปรายเกี่ยวกับเรื่องนี้ในรายชื่ออีเมล sqlite) แต่เครื่องมืออื่นอาจจัดหา VFS API ดังนั้นสิ่งที่คล้ายกันอาจเป็นไปได้ และเมื่อมีการใช้งานมันควรจะเข้ากันได้กับโครงสร้างฐานข้อมูลของความซับซ้อนใด ๆ
วิธีที่เราใช้สำหรับรายการฐานข้อมูลเวอร์ชันคือการใช้ตารางการตรวจสอบ ตารางมีสคีมาตามเส้นของ:
Seq - Int ' Unique identifier for this table
Event - Char ' Insert / Update / Delete
TblName - Char ' Table that had field value changed
FldName - Char ' Field that was changed
KeyValue - Char ' delimited list of values for fields that make up the PK of table changed
UsrId - Char ' User who made the change
OldValue - Char ' Old value (converted to character)
NewValue - Char ' New value (converted to character)
AddTs - DateTime ' When the change was made
จากนั้นเรามีทริกเกอร์ในการแทรก / อัพเดท / ลบของตารางที่เราต้องการติดตาม
ข้อดี:
จุดด้อย:
ฉันกำลังทำรุ่นนี้ในขณะนี้ สำหรับทุกเร็กคอร์ดฉันมีวันที่แทรกวันที่แก้ไขและและค่าสถานะบูลีนบันทึกแบบแอคทีฟ สำหรับการเริ่มต้นแทรกแทรกและวันที่ดัดแปลงเป็นชุดทั้งตอนนี้ () (นี่คือตัวอย่างใน Access) true
และบันทึกธงที่ใช้งานมีการตั้งค่า ถ้าฉันปรับเปลี่ยนระเบียนนั้นฉันจะคัดลอกสิ่งทั้งหมดไปยังระเบียนใหม่การเปลี่ยนฟิลด์ (s) ที่ผู้ใช้กำลังเปลี่ยนฉันจะปล่อยวันที่แทรกเท่ากับวันเดิมและเปลี่ยนวันที่แก้ไขเป็น Now () จากนั้นผมก็พลิกธงการใช้งานบันทึกของระเบียนเดิมและบันทึกใหม่เพื่อfalse
true
ฉันยังมีฟิลด์สำหรับ ModifiedRecordsParentID ที่ฉันบันทึกข้อมูลประจำตัวของระเบียนต้นฉบับ
ถ้าฉันต้องการสืบค้นฉันสามารถส่งคืนระเบียนที่ActiveRecord = true
ฉันจะได้รับข้อมูลที่ทันสมัยที่สุดเท่านั้น
ActiveRecord
ธง แถว MAX (*) ควรเป็นระเบียนปัจจุบันเสมอ การกู้คืนเป็นเวอร์ชันก่อนหน้านี้เพียงแค่แทรกกล่าวว่าแถวลงในตารางอีกครั้ง
select top 1 order by id descending
จะทำ
นอกจากนี้หากคุณต้องการเก็บการเปลี่ยนแปลงทั้งหมดในฐานข้อมูลเมื่อเวลาผ่านไปคุณอาจต้องการตรวจสอบการบันทึก ( /programming/3394132/where-can-i-find-the-mysql-transaction-log) )