← Back to list

Soft Delete και History Tables σε SQL Databas

Εισαγωγή στη διαχείριση ιστορικότητας δεδομένων

Nikosstit · 2025-12-05 18:10 · 0 claps · 2.4 min read paywalled
#soft-delete #history-table
Open on Medium ↗

Soft Delete και History Tables σε SQL Database

SOFT DELETE SQL HISTORY

SOFT DELETE SQL HISTORY

Εισαγωγή στη διαχείριση ιστορικότητας δεδομένων

Η ανάγκη για σωστή διαχείριση αλλαγών και διαγραφών αποτελεί βασικό ζήτημα σε οποιαδήποτε σχεσιακή βάση δεδομένων. Τα συστήματα σπάνια απαιτούν πραγματική διαγραφή, λόγω των συνεπειών που έχει η απώλεια πληροφορίας στην ακεραιότητα και την ιχνηλασιμότητα. Στην πράξη, δύο τεχνικές χρησιμοποιούνται ευρέως, το soft delete και τα history tables. Παρότι συχνά θεωρούνται ισοδύναμα, εξυπηρετούν διαφορετικούς σκοπούς και η επιλογή τους επηρεάζει τον συνολικό αρχιτεκτονικό σχεδιασμό.

Η έννοια του Soft Delete

Το soft delete είναι μια τεχνική όπου μια εγγραφή δεν αφαιρείται από τον βασικό πίνακα, αλλά χαρακτηρίζεται ως “διαγραμμένη” μέσω ενός πεδίου όπως IsDeleted ή DeletedAt. Η εγγραφή συνεχίζει να υπάρχει, αλλά αποκρύπτεται από την εφαρμογή. Η υλοποίηση είναι απλή, προσθέτουμε ένα πεδίο κατάστασης και τροποποιούμε τα queries ώστε να αγνοούν τις λογικά διαγραμμένες εγγραφές.

Παράδειγμα σχήματος:

ALTER TABLE Customer 
ADD IsDeleted BIT NOT NULL DEFAULT 0;

Παράδειγμα λογικής διαγραφής:

UPDATE Customer
SET IsDeleted = 1
WHERE Id = 42;

Η μέθοδος αυτή επιτρέπει εύκολη επαναφορά και ελάχιστες αλλαγές στο schema, αλλά προκαλεί σταδιακή αύξηση του πίνακα και δεν παρέχει ιστορικότητα αλλαγών εκτός από το γεγονός της διαγραφής.

Τι είναι το History Table

Το history table είναι ένας βοηθητικός πίνακας που αποθηκεύει κάθε παλιά κατάσταση μιας εγγραφής. Ο κύριος πίνακας περιέχει μόνο την τρέχουσα κατάσταση, ενώ το history table διατηρεί όλες τις προηγούμενες εκδόσεις. Αυτό εξασφαλίζει πλήρη ιχνηλασιμότητα σε αλλαγές, ενημερώσεις και διαγραφές.

Το history table μπορεί να στηθεί με triggers ή με temporal tables (system-versioned tables) όταν γίνεται χρήση SQL Server.

Παράδειγμα trigger για καταγραφή αλλαγών:

CREATE TRIGGER Customer_UpdateHistory
ON Customer
FOR UPDATE
AS
INSERT INTO CustomerHistory (CustomerId, Name, Email, ChangedAt, Operation)
SELECT Id, Name, Email, GETDATE(), 'UPDATE'
FROM inserted;

Η μέθοδος αυτή είναι απαραίτητη σε συστήματα όπου οι αλλαγές πρέπει να είναι πλήρως τεκμηριωμένες, όπως οικονομικές, νομικές ή οργανωτικές εφαρμογές.

System-Versioned Temporal Tables

Οι temporal tables είναι μια εξελιγμένη δυνατότητα όπου η ίδια η βάση αναλαμβάνει να αποθηκεύει όλες τις εκδόσεις των δεδομένων, χωρίς να χρειάζονται triggers ή κώδικας εφαρμογής.

Παράδειγμα μετατροπής πίνακα σε temporal:

ALTER TABLE Customer
ADD ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START,
    ValidTo   DATETIME2 GENERATED ALWAYS AS ROW END,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo);

ALTER TABLE Customer
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.CustomerHistory));

Αυτό προσφέρει hardware-επίπεδου απόδοση και ακεραιότητα.

Σύγκριση Soft Delete και History Table

Το soft delete ικανοποιεί επιχειρησιακές ανάγκες όπου δεν πρέπει να χαθούν εγγραφές και πρέπει να μπορούν να επανέλθουν. Όμως δεν παρέχει ιστορικότητα αλλαγών ούτε πληροφορίες για το τι προηγήθηκε της διαγραφής.

Το history table, αντίθετα, παρέχει πλήρη καταγραφή όλων των αλλαγών, αλλά δεν εξυπηρετεί μόνο του τη λειτουργική απαίτηση της “απλής απενεργοποίησης” μιας εγγραφής. Ο κύριος πίνακας παραμένει ελαφρύς και αποδοτικός, ενώ η ιστορικότητα αποθηκεύεται χωριστά με ακρίβεια και τεχνική συνέπεια.

Συνδυασμός Soft Delete και History Table

Πολλά επαγγελματικά συστήματα χρησιμοποιούν και τις δύο τεχνικές. Η λογική διαγραφή εξυπηρετεί τη λειτουργική απαίτηση να κρυφτούν εγγραφές χωρίς να χαθούν, ενώ το history table εξυπηρετεί την υποχρέωση καταγραφής όλων των αλλαγών και ενεργειών του χρήστη.

Παράδειγμα συνδυασμένης υλοποίησης:

UPDATE Customer
SET IsDeleted = 1
WHERE Id = 42;

-- Trigger μεταφέρει παλιά κατάσταση στο history table

Με αυτόν τον τρόπο το σύστημα προσφέρει τόσο δυνατότητα επαναφοράς όσο και πλήρες audit log.

Να θυμάσαι..

Η επιλογή μεταξύ soft delete και history tables δεν είναι ανταγωνιστική. Κάθε τεχνική καλύπτει διαφορετικό κενό στον σχεδιασμό ενός πληροφοριακού συστήματος. Το soft delete καλύπτει τον λειτουργικό κύκλο ζωής των δεδομένων, ενώ τα history tables εξασφαλίζουν διαφάνεια και ιχνηλασιμότητα. Σε περιβάλλοντα υψηλής κρισιμότητας, ο βέλτιστος σχεδιασμός περιλαμβάνει συνδυασμό και των δύο, προσφέροντας πλήρη ευελιξία, ασφάλεια και υπευθυνότητα.


메타데이터
post_id
4af81f47fd4c
slug
soft-delete-και-history-tables-σε-sql-databas-4af81f47fd4c
url
https://medium.com/@nikosstit/soft-delete-%CE%BA%CE%B1%CE%B9-history-tables-%CF%83%CE%B5-sql-databas-4af81f47fd4c
canonical_url
https://medium.com/@nikosstit/soft-delete-%CE%BA%CE%B1%CE%B9-history-tables-%CF%83%CE%B5-sql-databas-4af81f47fd4c
author_url
https://medium.com/@nikosstit
status
ok
fetched_at
2026-08-26 10:22:04