Chciałbym wdrożyć usuwanie logiczne dla rekordu kanału informacyjnego, aby obsługiwać późniejsze cofanie.
System jest w produkcji, więc każde rozwiązanie powinno obsługiwać istniejące dane.
Wstawianie rekordów do kanału jest idempotentne, dlatego wstawienie już usuniętego rekordu (ma ten sam klucz podstawowy) nie powinno go cofnąć.
Każde rozwiązanie powinno obsługiwać zapytania w celu pobrania strony istniejących lub usuniętych rekordów.Obsługa usuwania logicznego dla istniejącej tabeli plików danych
tabela pasza:
CREATE TABLE my_feed (
tenant_id int,
item_id int,
created_at timestamp,
feed_data text,
PRIMARY KEY (tenant_id, created_at, feed_id))
WITH compression = { 'sstable_compression' : 'LZ4Compressor' }
AND CLUSTERING ORDER BY (created_at DESC);
Istnieją dwa podejścia myślałem o ale obie mają poważne wady:
1. Przenieś usunięte rekordy do innej tabeli. Zapytania są trywialne i migracja nie jest wymagana, ale idempotentne wstawki wydają się być trudne (czytać tylko przed wstawieniem?).
2. Dodaj kolumnę is_deleted. Utwórz dodatkowy indeks dla tej kolumny, aby obsługiwać zapytania. Idempotent inserts wydaje się łatwiejszy w obsłudze (transakcje lekkie lub trik aktualizacji). Główną wadą jest to, że starsze rekordy mają wartość zerową, a zatem wymagają migracji danych.
Czy istnieje trzecie bardziej eleganckie podejście? Czy popierasz jedną z powyższych sugestii?
Muszę chronić się przed przywróceniem już usuniętych rekordów, ponieważ system zaprojektowano tak, aby jeden rekord mógł być wysłany więcej niż jeden raz (próby, migracje, procesy samoleczenia). W takich przypadkach oczekuje się, że po wstawieniu rekordu nie zostanie zmieniony, chyba że użytkownik go usunie. –
O 'is_deleted': zakładając, że klucz partycji (tenant_id) jest zawsze określony w zapytaniu, indeks wtórny powinien być efektywny również dla pól o niskiej liczności: [http://stackoverflow.com/q/26439396/3950710] –