klucze obce a usuwanie danych

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 ??

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

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

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).

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

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