วิธีที่จะมีประวัติการเปลี่ยนแปลงของรายการฐานข้อมูล


21

มีวิธีใดบ้างที่จะอนุญาตการกำหนดเวอร์ชันของรายการฐานข้อมูล (ข้อมูล)

คิดถึงความสามารถของระบบการจัดการเนื้อหาเพื่อย้อนกลับการเปลี่ยนแปลงของบทความ

ข้อดี / ข้อเสียของพวกเขาคืออะไร


1
คุณต้องการรุ่นอะไร สคีมาหรือข้อมูล
tdammers

1
ฉันต้องการรุ่นข้อมูล ที่จะเข้าพักตัวอย่างของ CMS ที่ช่วยบอกรุ่นของบทความ
matcauthon

คุณอาจต้องการดูเป็น Datomic
dan_waterworth

คำตอบ:


19

โดยทั่วไปมีสองวิธีคือ: ตารางการตรวจสอบที่มีค่าก่อนหน้าทั้งหมดที่เก็บไว้ในนั้นหรือรวมถึงวันที่เริ่มต้น / สิ้นสุดเป็นส่วนหนึ่งของตารางและการปรับปรุงทั้งหมดสร้างระเบียนใหม่ในขณะที่ปิดเก่า

อัปเดต: SQL SERVER 2016 รองรับสิ่งนี้เป็นรูปแบบการออกแบบ / พิมพ์ตาราง - https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017


4
ดังนั้นวิธีแรกอาจปรับขนาดได้มากกว่า เนื่องจากข้อมูล "ที่เก็บถาวร" จะไม่ค่อยเข้าถึงการออกแบบฐานข้อมูลจึงสามารถปรับให้เหมาะสมได้ และโต๊ะทำงานยังเล็ก ขึ้นอยู่กับความซับซ้อนมันควรจะเป็นไปได้ที่จะบันทึกแตกต่างเท่านั้น แนะนำให้ใช้รูปแบบของที่ระลึกหรือไม่?
matcauthon

1
ที่จะขึ้นอยู่กับการใช้งานของคุณอาจจะเพียงพอที่จะใช้ทริกเกอร์เพื่อเติมตาราง / s แล้วให้วิธีการเลือกสิ่งที่และวิธีการย้อนกลับ
jmoreno

คุณมีการพิมพ์ผิดในคำตอบของคุณ (ลายควรจะเป็นรูปแบบ)
geocodezip

7

แนวคิดหนึ่งคือการใช้ "ฐานข้อมูลแบบแทรกเท่านั้น" ความคิดพื้นฐานคือการที่คุณไม่เคยลบหรือการปรับปรุงข้อมูลในแถว

ตารางที่จะต้องได้รับการติดตามแต่ละคนจะมีสองdatetimeคอลัมน์และfrom toพวกเขาเริ่มต้นด้วยค่าNULLในแต่ละ (จุดเริ่มต้นของเวลาจนถึงจุดสิ้นสุด) เมื่อคุณจำเป็นต้อง "เปลี่ยน" แถวที่คุณเพิ่มแถวใหม่และในเวลาเดียวกันคุณอัปเดตtoในแถวก่อนหน้าNowและในแถวที่คุณกำลังจะไปเพิ่มfromNow

สำหรับข้อมูลเพิ่มเติมดูที่:

เทคนิคนี้เรียกว่าAuditTrailการจัดการข้อมูลดั้งเดิมและร้านค้าของ kinda เปลี่ยนประวัติศาสตร์

ดูเหมือนว่าคำถามเกี่ยวกับลักษณะนี้ได้โพสต์แล้ว:


น่าเศร้าที่ดูเหมือนว่าคำถามจะถูกลบ :(
Douglas Gaskell

ไม่มีปัญหานี่คือการเชื่อมโยง ข้อเสนอแนะการออกแบบที่ดีอีกข้อในลิงค์
Yusubov

2

ฉันคิดว่าคุณสามารถใช้ทริกเกอร์สำหรับแต่ละตารางและรักษาข้อมูลใน _history (หรือคุณสามารถให้ชื่อใด ๆ ) และทุกครั้งที่แทรกอัปเดตลบบนตารางหลักจะเรียกทริกเกอร์ของคุณและคุณสามารถบันทึกรายละเอียดในตารางนี้กลไกทริกเกอร์ ยังสามารถใช้ได้กับฐานข้อมูล SQLite ถ้าคุณใช้

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

ทุกฐานข้อมูลมีวิธีการเขียนและทริกเกอร์โค้ดของตัวเอง หากคุณใช้ SQLite โปรดเยี่ยมชมSQLite.orgเพื่อดูไวยากรณ์ สำหรับฐานข้อมูลอื่นคุณสามารถเยี่ยมชมเว็บไซต์อย่างเป็นทางการของพวกเขา


1

คุณอาจทราบถึงเครื่องมือSQL Sqlite db ทั้งหมดถูกบันทึกไว้ในไฟล์เดียว api ยังรองรับระบบไฟล์เสมือนดังนั้นโดยทั่วไปคุณสามารถจัดระเบียบที่เก็บข้อมูลได้ทุกที่และทุกรูปแบบเพียงตอบสนองต่อการอ่านและเขียนในการออฟเซ็ตไฟล์ แอปพลิเคชันที่เป็นไปได้สำหรับสิ่งนี้อาจเป็นการเข้ารหัสการบีบอัดและอื่น ๆ ส่วนที่ดีที่สุดคือเลเยอร์คอนเทนเนอร์ไม่ควรรู้อะไรเกี่ยวกับฐานข้อมูลรูปแบบไฟล์ sql หรือ sqlite เพียงแค่เชื่อฟัง xRead และ xWrite callbacks

หนึ่งในความคิดคือการใช้คุณสมบัติเครื่องเวลา ดังนั้นการดำเนินการ xWrite ใด ๆ จะบันทึกทุกเซ็กเมนต์มันจะเขียนทับในประวัติ "เลิกทำ" และผู้ใช้สามารถเลือกวันที่ในอดีตเพื่อดูว่า db มีอะไรอยู่ (อาจเป็นโหมดอ่านอย่างเดียว) ฉันยังไม่มีตัวอย่างการทำงาน (มีการอภิปรายเกี่ยวกับเรื่องนี้ในรายชื่ออีเมล sqlite) แต่เครื่องมืออื่นอาจจัดหา VFS API ดังนั้นสิ่งที่คล้ายกันอาจเป็นไปได้ และเมื่อมีการใช้งานมันควรจะเข้ากันได้กับโครงสร้างฐานข้อมูลของความซับซ้อนใด ๆ


คุณคิดว่าวิธีนี้สามารถปรับขนาดได้สำหรับโครงการขนาดใหญ่
matcauthon

ฉันคิดว่าสิ่งนี้สามารถเพิ่มค่าใช้จ่ายข้อมูลจำนวนมากสำหรับการเปลี่ยนแปลงข้อมูลขนาดใหญ่ (เห็นได้ชัดว่าควรบันทึกทุกการเปลี่ยนแปลงแม้ว่าการบีบอัดสำหรับรุ่นเก่าจะช่วยได้) นอกเหนือจากจุดเริ่มต้นของสคีมาของคุณตราบใดที่มันใช้งานได้สำหรับสองตารางมันทำงานได้ยี่สิบ
Maksee

1

วิธีที่เราใช้สำหรับรายการฐานข้อมูลเวอร์ชันคือการใช้ตารางการตรวจสอบ ตารางมีสคีมาตามเส้นของ:

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

จากนั้นเรามีทริกเกอร์ในการแทรก / อัพเดท / ลบของตารางที่เราต้องการติดตาม

ข้อดี:

  • ข้อมูลทั้งหมดอยู่ในหนึ่งตาราง
  • สามารถตั้งค่าเพื่อติดตามเขตข้อมูลทั้งหมดหรือเขตข้อมูลเฉพาะในตาราง
  • ง่ายต่อการแสดงการกำหนดเวอร์ชันในแต่ละฟิลด์สำหรับตาราง

จุดด้อย:

  • การมีข้อมูลการตรวจสอบทั้งหมดในตารางเดียวส่งผลให้มีระเบียนจำนวนมาก
  • จำเป็นต้องใช้ทริกเกอร์จำนวนมาก

0

ฉันกำลังทำรุ่นนี้ในขณะนี้ สำหรับทุกเร็กคอร์ดฉันมีวันที่แทรกวันที่แก้ไขและและค่าสถานะบูลีนบันทึกแบบแอคทีฟ สำหรับการเริ่มต้นแทรกแทรกและวันที่ดัดแปลงเป็นชุดทั้งตอนนี้ () (นี่คือตัวอย่างใน Access) trueและบันทึกธงที่ใช้งานมีการตั้งค่า ถ้าฉันปรับเปลี่ยนระเบียนนั้นฉันจะคัดลอกสิ่งทั้งหมดไปยังระเบียนใหม่การเปลี่ยนฟิลด์ (s) ที่ผู้ใช้กำลังเปลี่ยนฉันจะปล่อยวันที่แทรกเท่ากับวันเดิมและเปลี่ยนวันที่แก้ไขเป็น Now () จากนั้นผมก็พลิกธงการใช้งานบันทึกของระเบียนเดิมและบันทึกใหม่เพื่อfalse trueฉันยังมีฟิลด์สำหรับ ModifiedRecordsParentID ที่ฉันบันทึกข้อมูลประจำตัวของระเบียนต้นฉบับ

ถ้าฉันต้องการสืบค้นฉันสามารถส่งคืนระเบียนที่ActiveRecord = trueฉันจะได้รับข้อมูลที่ทันสมัยที่สุดเท่านั้น


ไม่จำเป็นต้องมีActiveRecordธง แถว MAX (*) ควรเป็นระเบียนปัจจุบันเสมอ การกู้คืนเป็นเวอร์ชันก่อนหน้านี้เพียงแค่แทรกกล่าวว่าแถวลงในตารางอีกครั้ง
กลับรายการ

ฉันไม่แน่ใจว่าจะเลือกได้อย่างไร แต่ตอนนี้คุณกำลังเรียกสิ่งนี้ว่าฉันกำลังคิดเกี่ยวกับมันและมีความคิดอืมมมมม.
Brad

โดยปกติ MAX (column_name) จะเลือกค่าที่มากที่สุดในคอลัมน์ของตาราง หากต้องการเลือกทั้งแถวการดำเนินการแบบง่ายselect top 1 order by id descendingจะทำ
กลับรายการ

ใช่มันใช้งานได้ง่ายสำหรับบันทึกเดี่ยว แต่ตารางของฉันคือชุดของระเบียนเด็กซึ่งจะต้องเลือกในครั้งเดียว แต่สามารถแก้ไขได้ทีละรายการ ซับซ้อนขึ้นอีกเล็กน้อย
แบรด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.