Tombstone Table vs Deleted Flag ในสถานการณ์การซิงโครไนซ์ฐานข้อมูล & การลบแบบอ่อน


17

ฉันต้องติดตามรายการที่ถูกลบเพื่อให้ตรงกับความต้องการของลูกค้า

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

คำตอบ:


17

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

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

ฉันเห็นว่ามันเป็นเรื่องของการซื้อขายระหว่างความต้องการของระบบที่แตกต่างกัน หากฉันต้องการลบอย่างรวดเร็ว / ยกเลิกการลบการตั้งค่าสถานะจะดีกว่า แต่ถ้าฉันต้องการการสืบค้นที่รวดเร็วในรายการที่ถูกลบและบนตารางหลักและบางทีฉันต้องติดตามการเปลี่ยนแปลงประเภทใดวิธีการของ tombstone อาจเป็น ดีกว่า
Lorenzo Polidori

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

5

บางทีคุณควรรวมสองวิธีเข้าด้วยกัน ทำไม ???

ลองใช้ตารางนั้น (ภาษาถิ่นของ MySQL)

CREATE TABLE mydata
(
    id int not null auto_increment
    firstname varchar(16) not null,
    lastname varchar(16) not null,
    zipcode char(5) not null,
    ...
    deleted tinyint not null default 0
    KEY (deleted,id),
    KEY (deleted,lastname,firstname,id),
    KEY (deleted,zipcode,id),
    KEY (lastname,firstname),
    KEY (zipcode),
    PRIMARY KEY (id)
);

โปรดทราบว่ามีข้อยกเว้นของคีย์หลักดัชนีที่คุณทำทุกคนควรจะนำหน้าด้วยธงและลงท้ายด้วยdeletedid

มาสร้างตารางหลุมศพกัน

CREATE TABLE mytomb SELECT id FROM mydata WHERE 1=2;
ALTER TABLE mytomb ADD PRIMARY KEY (id);

หากตารางของคุณมีdeletedธงอยู่แล้วคุณสามารถเติมตาราง tommstone ได้

INSERT INTO mytomb SELECT id FROM mydata WHERE deleted = 1;

ตกลงตอนนี้ข้อมูลและหลุมฝังศพถูกเตรียมไว้ล่วงหน้า คุณทำการลบอย่างไร

สมมติว่าคุณกำลังลบทุกคนในรหัสไปรษณีย์ 07305 คุณจะเรียกใช้ต่อไปนี้:

INSERT IGNORE INTO mytomb SELECT id FROM mydata WHERE deleted=0 AND zipcode='07305';
UPDATE mydata SET deleted=1 WHERE deleted=0 AND zipcode='07305';

ตกลงนี่ดูเหมือนว่าจะมีค่าใช้จ่ายมากมายในแบบที่คุณมอง

ตอนนี้คุณต้องการดูข้อมูลที่ถูกลบทั้งหมดหรือไม่ นี่คือสองวิธีที่ต่างกัน:

  • SELECT * FROM mydata WHERE deleted=1;
  • SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);

หากจำนวนรหัสใน mytomb มากกว่า 5% ของจำนวนแถวของ mydata แสดงว่าเป็นการสแกนแบบเต็มตาราง มิฉะนั้นการสแกนดัชนีพร้อมการค้นหาแต่ละแถว บันทึกมาตรฐานใด ๆ ในส่วนนี้ ค้นหาแผนการอธิบาย

ตอนนี้คุณต้องการเห็นทุกคนในรหัสไปรษณีย์ 07304 หรือไม่? นี่คือสองวิธีที่ต่างกัน:

  • SELECT * FROM mydata WHERE deleted=1 AND zipcode='07304';
  • SELECT A.* FROM mydata A LEFT JOIN mytomb B USING (id) WHERE B.id IS NULL AND A.zipcode='07304'

แล้วการลบมวลล่ะ นี่คือสองวิธีที่ต่างกัน:

  • DELETE FROM mydata WHERE deleted=1;
  • DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;

สรุปผลการศึกษา

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


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