ตารางฐานข้อมูลควรใช้การประทับเวลาเมื่อใด


18

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

ฉันสงสัยว่าเมื่อใดที่ตารางฐานข้อมูลควรเพิ่มการประทับเวลาที่สร้างและอัปเดต

คำตอบแรกที่ชัดเจนคือถ้าตรรกะทางธุรกิจใด ๆ จำเป็นต้องรู้เมื่อมีการปรับปรุงบางสิ่ง (เช่นวันที่ทำธุรกรรมเสร็จสิ้นเป็นต้น) ก็ต้องเข้าไป

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

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

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

ดังนั้นตารางฐานข้อมูลควรใช้การสร้างและอัพเดตการประทับเวลาเมื่อใด


2
ฉันคิดว่าคุณตอบคำถามด้วยตัวเองแล้ว คำตอบเดียวที่สามารถให้ได้คือ "มันขึ้นอยู่กับสถานการณ์"
ฟิลิปป์

3
ในทางปฏิบัติฉันมีการประทับเวลาเกือบทุกตาราง (ส่วนใหญ่ด้วยเหตุผลที่คุณพูดถึง) เท่าที่ฉันสามารถบอกได้ว่านี่ไม่มีผลกระทบด้านลบต่อประสิทธิภาพอย่างน้อยสำหรับประเภทของฐานข้อมูลที่ใช้กันทั่วไปในการพัฒนาเว็บด้วยอาจมีบทความ 30.000 บทความและคำสั่งซื้อนับแสนรายการ (ซึ่งต้องการการประทับเวลาอยู่แล้ว) อาจมีกรณีที่มีขอบ แต่ตัวอย่างเช่นระบบ ERP ของเรา (Microsoft Navision) hase timestamps เหล่านั้นบนตารางส่วนใหญ่เช่นกัน
thorsten müller

2
คุณบอกว่าการให้เวลาทุกตารางเป็นวิธีที่ดีในการทำให้ชะงักฐานข้อมูลอย่างรวดเร็วแต่คุณไม่ได้บอกว่าทำไม ในเกือบทุก DBMS การประทับเวลาเป็นค่าที่น้อยมาก - โดยปกติคือ 8 ไบต์หรือน้อยกว่า เว้นแต่ว่าคุณจะเพิ่มดัชนีนั่นเป็นเรื่องเล็กน้อย
Ross Patterson

อัปเดตการประทับเวลาเนื่องจากมีการเปลี่ยนแปลงส่งผลถึงฉัน นั่นหมายความว่าคุณจะมีเวลาเพียงบันทึกการเปลี่ยนแปลงครั้งล่าสุดสิ่งที่คุณต้องการในธุรกิจคือมีประวัติการเปลี่ยนแปลงทั้งหมด
Pieter B

@PieterB มีค่าแน่นอนในการเก็บประวัติบางตาราง แต่ฉันไม่เคยเจอกรณีที่คุณต้องการทำเช่นนี้สำหรับทุกตาราง - YMMV
Robbie Dee

คำตอบ:


5

เพื่อการจัดการฐานข้อมูลที่ดีขึ้นและครอบคลุมมากขึ้นและการปฏิบัติที่ชาญฉลาดที่สุดคือการทำเช่นนั้น

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

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

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


15

ในฐานะคนที่มีทั้งผู้ลักลอบ (ผู้พัฒนา) และผู้ดูแลเกม (DBA) ฉันประหลาดใจมากที่ยังไม่เห็นคุณค่าในสิ่งนี้และคิดว่ามันขยายตัว

ใส่เพียง:

สำหรับตารางที่มีการเพิ่มระเบียน (แต่ไม่เคยอัปเดต) เช่นการเข้าสู่ระบบ ฯลฯ ฉันจะพิจารณาเพิ่มคอลัมน์ DATE_CREATED

สำหรับตารางใด ๆ ที่มีการเพิ่มและอัปเดตระเบียนฉันจะพิจารณาเพิ่ม DATE_CREATED และคอลัมน์ DATE_UPDATED

ฉันทำงานในหลาย ๆ ที่ที่ DATE_CREATED และ DATE_UPDATED รวมอยู่ในทุกตารางโดยค่าเริ่มต้นซึ่งเป็นส่วนหนึ่งของการออกแบบ

สำหรับฐานข้อมูลขนาดใหญ่ที่มีล้าน / แถวหลายพันล้านแถวที่มีการอัพเดทฐานข้อมูลในช่วงสองสามวันเรายังเพิ่มคอลัมน์ SOURCE สำหรับบางตารางที่ติดตามว่าหม้อข้อมูลใดทำให้เกิดการอัปเดตเช่นฟีดของบุคคลที่สามการอัปเดตผู้ใช้ ล้างข้อมูล ฯลฯ


6

วิธีถามคำถามคุณกำลังขอรายการสิ่งต่าง ๆ ฉันกำลังเสี่ยงที่จะไม่ตอบคำถามของคุณโดยตรง แต่ควรตอบเมื่อคุณควรใช้โซลูชันสำรอง

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

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

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


+1 นี่ก็เป็นเทคนิคทั่วไปที่สามารถใช้งานผ่านทริกเกอร์ตารางเพื่อโยนระเบียนลงในตารางประวัติซึ่งสามารถนำไปเดลต้าได้ RDBMS บางตัว (เช่นคุณสมบัติรำลึกความหลังของ Oracle) สนับสนุนการใช้แบบสอบถามแบบระบุเวลาซึ่งสถานะของข้อมูล ณ จุดหนึ่งในอดีตสามารถตรวจสอบได้
Robbie Dee

วิธีแก้ปัญหาอย่างง่ายจะช่วยให้บันทึกแบบสอบถามใด ๆ ที่ปรับปรุงและตารางลงในบันทึกหรือไม่
Gaz_Edge

นี่เป็นอีกวิธีหนึ่งแม้ว่ามันจะไม่สะดวกสำหรับตารางที่มีปริมาณ / ความถี่สูงของการอัพเดต ทำให้ตารางภายนอกสามารถแก้ปัญหาบางอย่างได้แม้ว่า ...
Robbie Dee

1

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

  1. ตารางแสดงระเบียนหลักของกิจกรรมที่ผู้ใช้จัดหา หากผู้ใช้ทำ X และคุณมีทั้ง a Table_Xและ a Table_Yซึ่งเป็นลูกแบบหนึ่งต่อหลายคนTable_X , Table_Yไม่ได้เป็นบันทึกหลักและอื่น ๆ ไม่จำเป็นต้องมีช่องเพิ่มเติม
  2. เมื่อคุณมีความต้องการที่ถาวรชั่วคราวหรือที่เกิดขึ้นสำหรับการติดตามระบบ หากคุณมีความต้องการที่จะตรวจสอบว่าTable_Yได้รับการปรับปรุงเมื่อTable_Xมีการปรับปรุงเท่านั้นเขตข้อมูลการติดตามพิเศษสามารถช่วยได้

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


0

ความเห็นส่วนตัว:

ฉันไม่เห็นคุณค่าใน modifiedคอลัมน์

createdควรเพิ่มในทุกตารางฐานข้อมูลเว้นแต่จะมีข้อยกเว้นเหตุผลอันจะไม่ทำ มันมีค่ามากสำหรับการมีที่นั่น

อย่างไรก็ตามupdatedดูเหมือนว่าจะเสีย ทำไมไม่เพียงไปที่หมูทั้งตัวสร้างตารางฐานข้อมูลสองตารางหนึ่งตารางที่ระบุ ID เอกสารและอีกเวอร์ชันของเอกสาร ในกรณีที่ง่ายมาก

create table document (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

create table version (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    document_id INT NOT NULL REFERENCES document(id),
    content TEXT NOT NULL,
    created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

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

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