klucze obce a usuwanie danych

klucze obce a usuwanie danych
M6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Potrzebuje pomocy w rozwiązaniu jeszcze jednoego problemu, mianowici jak zrobić żeby było poprawnie:\

PACJENT
id_pac <pk>
....

WIZYTA
id_wiz <pk>
id_pac <fk>

ZWOLNIENIE
id_zwoln <pk>
?

Relacje oczywiście są takie że:
pacjent może mieć wiele wizyt, konkretna wizyta do konkretnego pacjenta
jedna wizyta moze mieć jedno zwolnienie, konkretne zwolnienie przypisane do wizyty.

Gdzie należy umieścić kluc obcy - w tab. wizyta, czy zwolnienie kiedy chcę żeby podczas usuwania danych pacjenta usuniee zostały wizyty, zwolnienia itd.
Na chwilę obecną jak usuwam pacjent to jego wizyty są również usuwane, w takim razie idąc tym tokiem myślenia klucz obcy powinien być w tabeli zwolnienie do tabeli wizyta ??

Marcin.Miga
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2794
0

A co to znaczy "usuwam pacjenta"? Usuwasz go z bazy? Dlaczego? Wtedy powinieneś usunąć również wizyty (albo wyNULLować w nich pacjenta). A kto wtedy zapłaci lekarzowi za wizyty, których ... NIE MA

M6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Bo takie są założenia, właśnie o to codzi, po usunięciu pacjenta mają być usunięte wizyty, zwolnienia, recepty itd.
Chodzi mi o to po ktoórej stronie dać klucze

Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6823
0

To zależy. Jeżeli założenie jest takie, że pomiędzy wizytą, a zwolnieniem masz powiązanie typu jeden do jednego to w najbardziej koszernej odmianie nie powinieneś w ogóle tworzyć tabeli zwolnienia, a dane z niej przenieść do wizyty (joiny w relacji 1-1 to zło, choć ułatwiają "czytanie" bazy jako modelu biznesowego).
Jeżeli jednak musisz mieć dwie tabele łączone 1-1 (nigdy nie zrozumiem tego typu zadań), to popatrz kto jest właścicielem relacji od strony biznesowej. Może istnieć wizyta bez zwolnienia , ale zwolnienie bez wizyty już nie za bardzo. Zatem to wizyta powinna trzymać informacje o zwolnieniu. Zdecydowanie łatwiej jest zapisać warunek where zwolnienie != null + dodatkowy nieunikalny indeks niż kombinować z inner joinem by wybrać tylko wizyty mające zwolnienia. Może być jednak tak, że chcesz uniknąć z jakiegoś powodu nulli w bazie. Wtedy to zwolnienie powinno trzymać informację o wizycie (parafrazując klasyka - nie ma wizyty nie ma zwolnienia).

M6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Rozumiem, wiele mi to wyjaśniło, chodziło mi tylko o to, że mając tabele z kluczem obcym (wizyta mająca pk pacjent), przy założeniu ON UPDATE CASCADE ON DELETE CASCADE, krotki zostaną usunięte jeśli usunę pozycje PACJENT, natomiast dane w tabeli ZWOLNIENIA pozostaną ponieważ są powiązane kluczem obcym w tabeli WIZYTA, a kasowanie działa tylko w jedną stronę. Rozumiem założenie z relacją 1:1 faktycznie ma to sens, niestety muszę mieć to rozbite na tabele - siła wyższa

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.