ตารางประวัติฐานข้อมูล / ตารางการติดตาม


13

ขณะนี้ฉันต้องการจัดโครงสร้างตารางการติดตาม / ประวัติดังนี้:

  • PrimaryKey - ID
  • OtherTableId - fk
  • fieldName - ชื่อของฟิลด์ที่ติดตาม
  • OLDVALUE
  • NewValue
  • ชื่อผู้ใช้
  • CreateDateTime

โดยพื้นฐานแล้วฉันต้องการมีตารางที่จะติดตามประวัติของตารางอื่นเก็บชื่อคอลัมน์ของฟิลด์ที่ถูกเปลี่ยนแปลงด้วยค่าใหม่และเก่า คำถามของฉันคือทุกคนสามารถเจาะรูในนี้ นอกจากนี้วิธีที่ง่ายที่สุดในการตรวจสอบให้แน่ใจว่ามีเพียงชื่อคอลัมน์จากตารางที่ติดตามเท่านั้นที่ถูกป้อนลงในคอลัมน์ fieldName ปัจจุบันตัวเลือกของฉันจะต้องมี enum ในบริการที่ฉันกำลังสร้างหรือสร้างตารางสถานะอื่นและทำให้ fieldName เป็น fk มีความคิดที่ดีกว่านี้ไหม?

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

ขอบคุณ!


คุณรู้ล่วงหน้าหรือไม่ว่ามีกี่ตารางที่คุณกำลังติดตามอยู่
โคฟี Sarfo

ตารางนี้จะติดตามเพียงหนึ่งตารางเท่านั้นจนถึงตอนนี้เรากำลังติดตามเพียงหนึ่งตารางนี้เท่านั้น
user76982

ดังนั้นวิธีนี้อาจ overkill ยิ่งไปกว่านั้นมันจะไม่ง่ายนักหากจะทำการสืบค้นตารางนี้โดยการตรวจสอบร่วมกันเพื่อสร้างข้อมูลสด ณ เวลาหนึ่ง ๆ อีกครั้งควรสร้างสแนปช็อตใหม่ให้เป็นค่าใด ๆ
โคฟี Sarfo

1
ในทางกลับกันข้อความค้นหาเพื่อดูว่าคอลัมน์ใดเปลี่ยนแปลงบ่อยที่สุดจะทำได้ง่ายขึ้นโดยใช้วิธีที่คุณเสนอ
โคฟี Sarfo

คุณอาจต้องการที่จะค้นหาในdba.stackexchange.com ; มีการถามคำถามที่คล้ายกันและอาจมีคำตอบที่คุณสามารถใช้ได้
FrustratedWithFormsDesigner

คำตอบ:


8

Poking hole: จะเกิดอะไรขึ้นถ้า schema ของฐานข้อมูลถูกเปลี่ยนแปลงในเวลาเดียวกันในภายหลังและเปลี่ยนชื่อคอลัมน์หรือคอลัมน์ถูกลบอย่างสมบูรณ์? ระบบฐานข้อมูลจำนวนมากอนุญาตสิ่งนี้ จะเกิดอะไรขึ้นกับ "fieldName" ของคุณ?

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

หากคุณสามารถใช้ชีวิตกับโซลูชันเฉพาะของผู้จำหน่าย db: ระบบ db ส่วนใหญ่มีตารางระบบที่เก็บข้อมูล schema (ชื่อตาราง, รหัสตาราง, ชื่อคอลัมน์ ฯลฯ ) คุณสามารถตรวจสอบว่าเป็นไปได้ที่จะตั้งค่าการอ้างอิงคีย์ต่างประเทศไปยังตารางระบบดังกล่าว ซึ่งจะอนุญาตให้แทนที่ชื่อฟิลด์ด้วย ID ฟิลด์หากฐานข้อมูลรองรับบางสิ่งเช่นนี้

ที่จริงแล้วถ้าคุณต้องการติดตามทั้งแถวของตารางที่ระบุรวมถึงคอลัมน์ทั้งหมด (และไม่ใช่แค่ส่วนย่อยของคอลัมน์) คุณควรพิจารณา @ @ sarfeast อ่านบทความนี้เกี่ยวกับข้อเสียของโมเดลคู่ค่าชื่อ


8

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

เป้าหมายสุดท้ายนั่นคือสิ่งที่คุณต้องการทำกับข้อมูลที่ตรวจสอบแล้วจะช่วยประเมินความเหมาะสมของแต่ละวิธี


สวัสดี Sarfeast ฉันเพิ่มเป้าหมายสุดท้ายที่ฉันต้องการบรรลุ ขออภัยที่ไม่ได้รวมสิ่งนี้ไว้ด้วย
76982

วิธีนี้มีข้อเสีย อ่านที่นี่: database-programmer.blogspot.co.uk/2008/07/history-tables.html
Tuukka Haapaniemi

7

กล่าวโดยย่อ:คุณต้องตั้งค่ากลไกการตรวจสอบบัญชีสำหรับตารางที่คุณต้องการติดตามการเปลี่ยนแปลงค่า

ตารางตรวจสอบเส้นทางเดียว :

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

นี่คือโพสต์ที่ดีพร้อมสคริปต์เกี่ยวกับวิธีการบรรลุ - การสร้างเส้นทางการตรวจสอบ

การอ้างอิงที่มีประโยชน์อื่น ๆเพื่อค้นหา:


ลิงค์ที่สองไม่ดีในตอนนี้
Jeremy Harris

@cillosis ขอขอบคุณที่สังเกตสิ่งนี้ มันได้รับการอัพเดทแล้ว :)
Yusubov

3

คุณอาจต้องการตรวจสอบเอกสารโครงการของ NHibernate Envers เพื่อหาแนวคิด

โดยทั่วไปคุณมีตารางการแก้ไขหนึ่งตารางที่คุณสามารถเพิ่มข้อมูลพิเศษเช่นการประทับเวลาหรือผู้ใช้ จากนั้นแต่ละตารางที่คุณติดตามจะได้รับตารางการตรวจสอบเพิ่มเติมโดยมีคอลัมน์ทั้งหมดซ้ำกัน, fk ไปยังตารางการแก้ไขและประเภทการแก้ไข (เพิ่ม, แก้ไข, ลบ) AFAIK คุณไม่ต้องการให้ตารางการตรวจสอบของคุณมี FK จริงลงในตารางจริงเนื่องจากจะป้องกันการลบ

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