ฉันเคยเห็นแถวของตารางที่มีคอลัมน์เช่น 'ลบวันที่' ในพวกเขาและฉันไม่ชอบพวกเขา ความคิดของ 'ลบ' คือรายการไม่ควรทำตั้งแต่แรก ในทางปฏิบัติแล้วพวกเขาไม่สามารถลบออกจากฐานข้อมูล แต่ฉันไม่ต้องการให้พวกเขาด้วยข้อมูลที่ร้อนแรงของฉัน แถวที่ถูกลบแบบลอจิคัลคือข้อมูลที่เป็นหวัดถ้าไม่มีใครต้องการเห็นข้อมูลที่ถูกลบโดยเฉพาะ
นอกจากนี้ทุกแบบสอบถามที่เขียนจะต้องแยกพวกเขาและดัชนีจะต้องพิจารณาด้วยเช่นกัน
สิ่งที่ฉันต้องการจะดูคือการเปลี่ยนแปลงในระดับสถาปัตยกรรมฐานข้อมูลและระดับแอปพลิเคชัน: สร้างสคีมาที่เรียกว่า 'ลบ' แต่ละตารางที่ผู้ใช้กำหนดมีความเท่าเทียมกันใน schema 'ลบ' พร้อมกับเขตข้อมูลพิเศษที่ถือข้อมูลเมตา - ผู้ใช้ที่ลบมันและเมื่อ ต้องสร้างคีย์ต่างประเทศ
ถัดไปการลบจะเป็นการแทรกการลบ ก่อนอื่นแถวที่จะลบจะถูกแทรกลงในสคีมา 'ลบ' แถวที่มีปัญหาในตารางหลักนั้นจะสามารถลบได้ อย่างไรก็ตามต้องเพิ่มตรรกะพิเศษในที่ใดที่หนึ่งตามแนว การละเมิดคีย์ต่างประเทศสามารถจัดการได้
ต้องจัดการกับกุญแจต่างประเทศอย่างถูกต้อง เป็นวิธีปฏิบัติที่ไม่ถูกต้องที่จะลบแถวอย่างมีเหตุผล แต่มีหลัก / ไม่ซ้ำกันมีคอลัมน์ในตารางอื่น ๆ ที่อ้างถึง สิ่งนี้ไม่ควรเกิดขึ้น งานปกติสามารถลบแถวแม่ม่าย (แถวที่มีคีย์หลักไม่มีการอ้างอิงในตารางอื่นแม้จะมี foreign key อยู่) นี่คือตรรกะทางธุรกิจ
ประโยชน์โดยรวมคือการลดข้อมูลเมตาในตารางและปรับปรุงประสิทธิภาพที่นำมาใช้ คอลัมน์ 'deleteDate' บอกว่าแถวนี้ไม่ควรอยู่ที่นี่จริง ๆ แต่เพื่อความสะดวกเราได้ปล่อยมันไว้ที่นั่นและให้แบบสอบถาม SQL จัดการกับมัน หากสำเนาของแถวที่ถูกลบถูกเก็บไว้ในสคีมา 'ลบ' ดังนั้นตารางหลักที่มีข้อมูลร้อนจะมีเปอร์เซ็นต์ของข้อมูลร้อนที่สูงกว่า (สมมติว่ามันถูกเก็บถาวรในเวลาที่เหมาะสม) และคอลัมน์เมทาดาทาที่ไม่จำเป็นน้อยลง ดัชนี & ข้อความค้นหาไม่จำเป็นต้องพิจารณาฟิลด์นี้อีก ยิ่งขนาดของแถวสั้นลงเท่าไหร่ก็ยิ่งสามารถติดตั้งแถวเข้ากับหน้าได้มากขึ้นเท่านั้น
ข้อเสียเปรียบหลักคือขนาดของการดำเนินการ ขณะนี้มีสองการดำเนินการแทนการดำเนินการเช่นเดียวกับตรรกะพิเศษและการจัดการข้อผิดพลาด มันสามารถนำไปสู่การล็อคมากกว่าการปรับปรุงคอลัมน์เดียวมิฉะนั้นจะใช้ การทำธุรกรรมถือล็อคในตารางอีกต่อไปและมีสองตารางที่เกี่ยวข้อง การลบข้อมูลการผลิตอย่างน้อยในประสบการณ์ของฉันเป็นสิ่งที่ทำไม่ค่อย แม้จะยังอยู่ในหนึ่งในตารางหลัก 7.5% ของเกือบ 100 ล้านรายการมีรายการในคอลัมน์ 'DeletedDate'
ในฐานะที่เป็นคำตอบของคำถามแอปพลิเคชันจะต้องระวัง 'ยกเลิกการลบของ มันจะต้องทำแบบเดียวกันในลำดับย้อนกลับ: แทรกแถวจากสคีมา 'ลบ' ลงในตารางหลักแล้วลบแถวออกจากสคีมาที่ถูกลบ ต้องมีการจัดการตรรกะและข้อผิดพลาดเพิ่มเติมเพื่อหลีกเลี่ยงข้อผิดพลาดปัญหาเกี่ยวกับกุญแจต่างประเทศและสิ่งที่คล้าย