Jestem pewien, że wiele aplikacji, aplikacji krytycznych, banków itd. Robi to codziennie.
Ideą tego wszystkiego jest:
- wszystkie wiersze muszą mieć historię
- wszystkie linki muszą pozostać spójne
- składanie wniosków o uzyskanie „bieżących” kolumn powinno być łatwe
- klienci, którzy kupili przestarzałe rzeczy, powinni nadal zobaczyć, co kupili, nawet jeśli ten produkt nie jest już częścią katalogu
i tak dalej.
Oto, co chcę zrobić, a ja wyjaśnię problemy, przed którymi stoję.
Wszystkie moje tabele będą miały następujące kolumny:
idid_origindate of creationstart date of validitystart end of validity
A oto pomysły na operacje CRUD:
- create = wstaw nowy wiersz za pomocą
id_origin=id,date of creation= teraz,start date of validity= teraz,end date of validity= null (= oznacza, że jest to bieżący aktywny rekord) - aktualizacja =
- read = czytaj wszystkie rekordy z
end date of validity== null - zaktualizuj „bieżący” rekord
end date of validity= null za pomocąend date of validity= teraz - utwórz nowy z nowymi wartościami, a
end date of validity= null (= oznacza, że jest to bieżący aktywny rekord)
- read = czytaj wszystkie rekordy z
- delete = zaktualizuj „bieżący” rekord
end date of validity= null za pomocąend date of validity= teraz
Oto mój problem: z wieloma do wielu skojarzeniami. Weźmy przykład z wartościami:
- Tabela A (id = 1, id_origin = 1, start = teraz, end = null)
- Tabela A_B (start = teraz, koniec = null, id_A = 1, id_B = 48)
- Tabela B (id = 48, id_origin = 48, start = teraz, end = null)
Teraz chcę zaktualizować tabelę A, rekord id = 1
- Oznaczam rekord id = 1 za pomocą end = now
Wstawiam nową wartość do tabeli A i ... cholera, straciłem relację A_B, chyba że też zduplikuję relację ... skończyłoby się to tabelą:
Tabela A (id = 1, id_origin = 1, początek = teraz, koniec = teraz + 8 mln)
- Tabela A (id = 2, id_origin = 1, start = teraz + 8 min, end = null)
- Tabela A_B (start = teraz, koniec = null, id_A = 1, id_B = 48)
- Tabela A_B (start = teraz, koniec = null, id_A = 2, id_B = 48)
- Tabela B (id = 48, id_origin = 48, start = teraz, end = null)
I ... no cóż, mam inny problem: relacja A_B: czy mam oznaczyć (id_A = 1, id_B = 48) jako przestarzałe czy nie (A - id = 1 jest przestarzałe, ale nie B - 48)?
Jak sobie z tym poradzić?
Muszę to zaprojektować na dużą skalę: produkty, partnerzy i tak dalej.
Jakie jest twoje doświadczenie w tej sprawie? Jak byś zrobił (jak to zrobiłeś)?
-- Edytować
Znalazłem ten bardzo interesujący artykuł , ale nie radzi sobie właściwie z „kaskadowaniem przestarzałości” (= o co właściwie pytam)