ฐานข้อมูล: เพื่อลบหรือไม่ลบบันทึก


117

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


67
... ไม่ว่าจะเป็นขุนนางในฐานข้อมูลที่ต้องทนทุกข์ทรมานจากการขยายตัวและความซ้ำซ้อนของแฟล็กหรือใช้ DELETE ไปยังตารางของระเบียนและโดยการลบให้จบลง ในการลบการนอนหลับ
nickf

7
เฮ้! ฉันจะโหวตความคิดเห็นได้อย่างไร ??
Nifle

คำตอบ:


48

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

โดยพื้นฐานแล้วสิ่งที่คุณต้องถามตัวเองฉันอาจต้องกู้คืนข้อมูลนี้หรือไม่? เช่นเดียวกับคำถามที่ถูกลบใน SO คำถามเหล่านี้ควรถูกทำเครื่องหมายว่า 'ลบ' อย่างแน่นอนเนื่องจากเรากำลังอนุญาตให้ยกเลิกการลบ เรายังมีตัวเลือกในการแสดงเพื่อเลือกผู้ใช้เช่นกันโดยไม่ต้องทำงานพิเศษมากนัก

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

สำหรับข้อมูลชั่วคราวโปรดดู: http://talentedmonkeys.wordpress.com/2010/05/15/temporal-data-in-a-relational-database/


30

ข้อดีของการใช้ลบแฟล็ก:

  1. คุณสามารถรับข้อมูลกลับมาได้ในภายหลังหากคุณต้องการ
  2. การดำเนินการลบ (การอัปเดตแฟล็ก) อาจเร็วกว่าการลบจริงๆ

ข้อเสียของการใช้ค่าสถานะลบ:

  1. มันง่ายมากที่จะพลาดAND DeletedFlag = 'N'ที่ไหนสักแห่งใน SQL ของคุณ
  2. ช้ากว่าสำหรับฐานข้อมูลเพื่อค้นหาแถวที่คุณสนใจในบรรดาอึทั้งหมด
  3. ในที่สุดคุณอาจต้องการลบทิ้งจริงๆ (สมมติว่าระบบของคุณประสบความสำเร็จแล้วเมื่อบันทึกนั้นมีอายุ 10 ปีและถูก "ลบ" 4 นาทีหลังจากสร้างครั้งแรก)
  4. สามารถทำให้ไม่สามารถใช้คีย์ธรรมชาติได้ คุณอาจมีแถวที่ลบอย่างน้อยหนึ่งแถวพร้อมด้วยคีย์ธรรมชาติและแถวจริงที่ต้องการใช้คีย์ธรรมชาติเดียวกันนั้น
  5. อาจมีเหตุผลทางกฎหมาย / การปฏิบัติตามข้อกำหนดที่คุณควรลบข้อมูลจริงๆ

23

เป็นส่วนเติมเต็มทุกกระทู้ ...

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


11

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

เรากำลังใช้ postgresql และ Ruby บนรางดูเหมือนว่าเราสามารถทำได้ด้วย 1 ในสองวิธีแก้ไขรางหรือเพิ่มทริกเกอร์ ondelete และใช้ฟังก์ชัน pl / pgsql แทนเพื่อทำเครื่องหมายว่าลบแล้ว ฉันเอนเอียงไปทางด้านหลัง

สำหรับความนิยมด้านประสิทธิภาพการดูผลลัพธ์ของ EXPLAIN-ANALYZE บนตารางขนาดใหญ่ไปจนถึงรายการที่ถูกลบเพียงไม่กี่รายการและรายการที่ถูกลบจะเป็นเรื่องที่น่าสนใจ

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

แต่อย่างที่ใครบางคนกล่าวไว้ว่าบางครั้งคุณอาจต้องการคีย์นั้นคืนด้วยเหตุผลบางประการ ณ จุดนั้นคุณจะต้องลบออกจริงๆจากนั้นสร้างระเบียนใหม่ (เมื่อยกเลิกการลบและแก้ไขบันทึก)


1
+1 เนื่องจากความเป็นมิตรกับผู้ใช้รวมถึงการจำกัดความสามารถของฉันในการทำผิดพลาดร้ายแรง
Jesse

6

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

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

ฉันจะตรวจสอบกับฝ่ายกฎหมายของคุณก่อนที่คุณจะใช้กลยุทธ์ไม่ว่าจะด้วยวิธีใดก็ตามหากข้อมูลส่วนบุคคลมีส่วนเกี่ยวข้อง


5

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


2

หากคุณกังวลว่าระเบียน "อยู่เฉยๆ" จะทำให้การเข้าถึงฐานข้อมูลของคุณช้าลงคุณอาจต้องการย้ายแถวเหล่านั้นไปยังตารางอื่นที่ทำหน้าที่เป็นตาราง "เก็บถาวร"


1

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

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