Temat: A ja się dziwię programistom, przepraszam Was...
Wszystko zależy od tego, co robimy. W prostych sytuacjach redundancja na poziomie rekordu w bazie nie jest nam potrzebna i wystarczy tabela audytowa. Czasem potrzebne jest i jedno (FK - dla łatwego wyszukiwania informacji) i drugie (redundancja - historyczność danych) i jest to chyba najlepsze rozwiązanie.
Jeśli jest to aplikacja, w której nie interesuje nas historia zmian, to wystarczy FK w bazie do pacjenta, plus w razie czego jakiś prosty auditing do osobnej tabeli - tylko dla naszej wygody. Pacjent jest zawsze tym samym fizycznie bytem. I tutaj wygodnie się wyszukuje informacje w bazie. Załóżmy, że jesteśmy właścicielem wideoteki i chcemy zobaczyć, kto jakie filmy wypożycza celem wygenerowania oferty promocyjnej. Interesuje nas WW (wielokrotna wdowa :) ) Kunegunda Wrocławska, która zmieniała 3 razy nazwisko po kolejnych mężach. Wystarczy, że podamy jedno z nazwisk, a grzebiąc po tabeli audytowej dotrzemy, jak po sznurku, do jej PK, a mając PK - możemy wygenerować kompletną listę rezultatów wyszukiwania. Zakładamy, że nie można prościej się do tego dokopać (np. po
PESELu).
Ale już w aplikacji medycznej czy innej, obwarowanej ostro przepisami prawa, nie chcemy brońcie bogowie ingerować w np. treść dokumentu księgowego czy medycznego i nie chcemy tam kluczy, a konkretne wartości, jako, że ów dokument jest trwałym, odrębnym, historycznym bytem. Trudno bowiem wyobrazić sobie, że wystawiamy fakturę na Kunegundę Gitarowską, która, po kolejnym "zamęściu" zmieniła nazwisko na Wrocławska, a owa faktura ma jedynie FK do naszej pacjentki. Nagle wszystkie historyczne faktury automatycznie są wystawione na osobę, której personalia były w tamtym czasie inne. Podobnie z nazwą badania, która "linkuje" do wypisów ze szpitala, czy innych parametrów, których zmiana, w razie np. śledztwa będzie mieć kluczowe znaczenie.
Tutaj tabela zmian jest tylko częściowym rozwiązaniem, bo chociaż "pozwala się dokopać do tego, jak było", to nie eliminuje modyfikacji dokumentów opartych o FK. Jest to takie "niespójne", śliskie, bo niby wiemy, że fizycznie mielibyśmy osobny dokument z własnymi wartościami (papier, podpisany elektronicznie plik), a tu mamy FK plus dodatkowo jakieś mechanizmy wersjonowania danych.
Z drugiej strony utrudnia to bądź uniemożliwia wyszukiwanie, jeśli lista zmian nie jest powiązana z bytem "pacjent", a za każdym razem zmiany są zapisywane do bazy. Jak rezygnujemy z "relacji do pacjenta" i zapisujemy za każdym razem pełne dane (pomijam nawet literówki) i zapytamy o listę chorób Kunegundy Żelazny-Toporek, która rok wcześniej nazywała się Wrocławska po drugim mężu, a wcześniej Gitarowska po pierwszym mężu, nie dostaniemy kompletnej odpowiedzi. Oczywiście - ktoś powie, że należy wyszukiwać po PESELu albo innym atrybucie dyskryminującym, np. ID karty pacjenta, ale to była tylko ilustracja, gdyż rzeczywistość wskaże za chwilę taki atrybut, który może się zmienić, a mimo to trzeba po nim wyszukiwać również historyczne dane. Trzeba, bo pacjent, który dzwoni, nie pamięta swojego PESELa, numeru karty stałego klienta czy jeszcze tam czegoś innego. I tutaj najlepiej stosować zarówno FKi do łatwego wyszukiwania, jak również redundancję na poziomie rekordu dla zachowania historyczności danych.
PS: tak, świadomie operuję pojęciami z RDB, zamiast - asocjacja i agregacja :)
Adrian Olszewski edytował(a) ten post dnia 07.07.11 o godzinie 12:55