SQL - jak najlepiej zaprojektować tabele w przypadku zmiany danych

0

Cześć, zastanawiam się jak najlepiej rozwiązać taki problem.

Mam dwie tabele w bazie:

  1. Kontrole (id_kontroli, id_podmiotu_kontrolowanego)
  2. Podmioty_kontrolowane (id_podmiotu_kontrolowanego, rodzaj_podmiotu (np. sklep, hurtownia), nazwa, miasto, ulica, nr_domu, nr_lokalu)

oraz problemy wynikające z takiej struktury:

  1. Gdy zmienię w tabeli "Podmioty_kontrolowane" adres podmiotu kontrolowanego, zmieni się on również w kontroli (gdyż tabele są połączone relacją), co jest niedopuszczalne i przekłada się na dalsze sortowanie danych (np. pokaż wszystkie kontrole z miasta Wrocław, Warszawa, itp)
  2. Gdy zmienię w tabeli "Podmioty_kontrolowane" rodzaj podmiotu kontrolowanego, zmieni się on również w kontroli (gdyż tabele są połączone relacją), co jest niedopuszczalne i przekłada się na dalsze sortowanie danych (np. pokaż wszystkie kontrole sklepów, hurtowni itp.)

Czy możecie mnie ukierunkować jak to zaprojektować aby wyeliminować te problemy?
Z góry dziękuję :)
Pozdrawiam
Tomek

0

Nie edytuj już istniejących rekordów, tylko twórz nowe - te stare najwyżej oznaczaj flagą aktywne = 0.

0

To jest kwestia jak trzymać zmiennośc w czasie, aby uniknąć sytuacji o ktorej mówisz.

Rozwiązanie

Dwie tabele w bazie:

  1. Kontrole (id_kontroli, id_podmiotu, rodzaj_podmiotu (np. sklep, hurtownia), nazwa, miasto, ulica, nr_domu, nr_lokalu)
  2. Podmioty (id_podmiotu_kontrolowanego, rodzaj_podmiotu (np. sklep, hurtownia), nazwa, miasto, ulica, nr_domu, nr_lokalu)

W tabeli kontrole przechowujesz pola które chcesz mieć zmiennne w czasie
W tabeli podmioty aktualny stan danych

Możesz też zrobić tabelę historii zmian na Podmiocie i uzależniać w raporcie dane akrualne na dzień kontroli

0

Dodaj kolumnę oznaczającą wersję, gdzie konkretna stała wartość oznacza wersję aktualną. Nie rób tego w ten sposób, że maksymalny numer to wersja najnowsza, bo to jest niewydajne - wymaga zrobienia max(kolumna) do znalezienia aktualnej wersji rekordu.
Albo zrób osobne tabele do trzymania historii, jeśli nie ma potrzeby sięgania do nich tym samym zapytaniem co do danych aktualnych.

0
Panczo napisał(a):

To jest kwestia jak trzymać zmiennośc w czasie, aby uniknąć sytuacji o ktorej mówisz.

Rozwiązanie

Dwie tabele w bazie:

  1. Kontrole (id_kontroli, id_podmiotu, rodzaj_podmiotu (np. sklep, hurtownia), nazwa, miasto, ulica, nr_domu, nr_lokalu)
  2. Podmioty (id_podmiotu_kontrolowanego, rodzaj_podmiotu (np. sklep, hurtownia), nazwa, miasto, ulica, nr_domu, nr_lokalu)

W tabeli kontrole przechowujesz pola które chcesz mieć zmiennne w czasie
W tabeli podmioty aktualny stan danych

Ale taka wersja jest raczej mało znormalizowana ?

0

Raczej zdenormalizowana, ale wygodna ;)

1
Panczo napisał(a):

Raczej zdenormalizowana, ale wygodna ;)

Realne programowanie często używa postaci nieznormalizowanej / nie w pełni znormalizowanej. Jeden z prelegentów używał słów, że najlepsza postać znormalizowana to jest dwa i pół

Zresztą "analiza normalizacyjna" (nie mam lepszego słowa) też da wyniki, o ile "adres" przezwiemy na "adres w czasie" lub jeszcze lepiej "wersja adresu"

1 użytkowników online, w tym zalogowanych: 0, gości: 1