Przejdź do głównej zawartości

Foreign Keys Reference

┌─────────────────────────────────────────────────────────────────────────┐
│ CORE ENTITIES │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ users ◄─────────────┬────────────────┬─────────────────────────────► │
│ │ │ │ │
│ │ 1:N │ 1:N │ 1:1 │
│ ▼ ▼ ▼ │
│ visits user_sessions user_preferences │
│ │ │
│ │ N:1 │
│ ▼ │
│ patients ◄──────────────────────────────────────────────────────────► │
│ │
└─────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────┐
│ AUDIO PIPELINE │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ visits ◄────────── recordings ─────────► transcripts (1:1) │
│ │ │ │
│ │ │ │
│ ▼ ▼ │
│ speaker_segments patients (optional) │
│ │
└─────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────┐
│ TASKS & REMINDERS │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ tasks ────────────► visits (optional) │
│ │ │
│ ├────────────────► patients (optional) │
│ │ │
│ └────────────────► users (assigned_to, created_by) │
│ │
│ reminders ─────────► users (assigned_to - required) │
│ │ │
│ ├────────────────► patients (optional) │
│ │ │
│ └────────────────► visits (optional) │
│ │
│ ai_task_suggestions ► visits (required) + patients (required) │
│ │
└─────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────┐
│ AI CHAT │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ chat_sessions ────► users (optional) │
│ │ │
│ ├────────────► visits (optional) │
│ │ │
│ └──────────────────────┬──────────────────┐ │
│ │ │ │
│ ▼ ▼ │
│ chat_messages chat_attachments │
│ │
└─────────────────────────────────────────────────────────────────────────┘

ParentChildRuleUwagi
patientsappointmentsCASCADEUsunięcie pacjenta usuwa jego wizyty
usersappointments.veterinarian_idCASCADE
visitsappointments.visit_idSET NULLAppointment zostaje, tylko visit_id = NULL
patientsai_task_suggestionsCASCADE
visitsai_task_suggestionsCASCADE
recordingstranscriptsCASCADE1:1 - usunięcie nagrania usuwa transkrypt
usersuser_sessionsCASCADE
usersuser_preferencesCASCADE
usersuser_working_hoursCASCADE
userspin_lockoutCASCADE
usersdashboard_stateCASCADE
userspersonal_notesCASCADE
userscustom_dictionaryCASCADE
chat_sessionschat_messagesCASCADEUsunięcie sesji usuwa wiadomości
usersrecordings.created_bySET NULLNagranie zostaje, autor = NULL
patientstasks.patient_idSET NULL
visitstasks.visit_idSET NULL
userstasks.assigned_toSET NULL
userstasks.created_bySET NULL
usersreminders.created_bySET NULL
usersreminders.assigned_toCASCADEUsunięcie usera usuwa jego przypomnienia
patientsreminders.context_patient_idSET NULL
visitsreminders.context_visit_idSET NULL
visitsvisit_sharesCASCADE
usersvisit_shares.shared_byCASCADE
usersvisit_shares.shared_withCASCADE

ParentChild.ColumnProblemRekomendacja
patientsvisits.patient_idBRAKPowinno być CASCADE lub SET NULL
usersvisits.user_idBRAKPowinno być SET NULL
usersuser_sessions.user_idBRAKPowinno być CASCADE
patientsclinical_notes.patient_idBRAKPowinno być CASCADE
usersclinical_notes.user_idBRAKSET NULL
patientsmedia_files.patient_idBRAKSET NULL
visitsmedia_files.visit_idBRAKSET NULL
usersmedia_files.uploaded_byBRAKSET NULL
visitsspeaker_segments.visit_idBRAKCASCADE
visitsrecordings.visit_idBRAKSET NULL
patientsrecordings.patient_idBRAKSET NULL
userstime_blocks.created_byBRAKSET NULL
userstime_blocks.updated_byBRAKSET NULL
usersappointments.created_byBRAKSET NULL
usersappointments.updated_byBRAKSET NULL


IDPriorytetProblemLokalizacja
DB-001P0Hard delete visitsvisits - brak soft-delete dla dokumentów medycznych
DB-002P1FK bez ON DELETEvisits.patient_id, visits.user_id
DB-003P1Błędny FKchat_attachments.session_id → user_sessions
DB-004P2Niespójny soft-deleteTylko users ma is_deleted + deleted_at
DB-005P2FK bez ON DELETEclinical_notes, media_files, speaker_segments
DB-006P3Polska nazwa polavisits.ai_sugestie → powinno być ai_suggestions

ScenariuszRegułaPrzykład
Child nie ma sensu bez parentaCASCADEchat_messageschat_sessions
Child może istnieć samodzielnieSET NULLtasksvisits
Dane medyczne / auditSET NULL lub NO ACTIONZachowaj historię
Dane tymczasoweCASCADEpassword_reset_tokens
-- Włącz FK constraints (wymagane przy każdym połączeniu)
PRAGMA foreign_keys = ON;
-- Sprawdź czy są FK violations
PRAGMA foreign_key_check;
-- Sprawdź definicje FK dla tabeli
PRAGMA foreign_key_list(visits);