Soft Delete και History Tables σε SQL Databas
Εισαγωγή στη διαχείριση ιστορικότητας δεδομένων
Soft Delete και History Tables σε SQL Database

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