Diciamo che un utente ha una serie di dati. Questi dati sono memorizzati nella tabella user_data. Questa tabella user_data viene referenziata da altri utenti in qualche modo. Nel caso in cui l'utente desideri eliminare una riga dalla tabella user_data, l'integrità referenziale stabilisce che non può essere eseguita finché esiste un riferimento a tali dati.
Lascia che ti spieghi ulteriormente fornendoti un esempio del tipo di dati che l'utente può memorizzare e che fa riferimento ad altri utenti: un servizio di streaming video semplificato. Alcuni dati da memorizzare:
user_videos
id
VIDEO_NAME
video_url
owner_id
video_playlist
id
nome
owner_id
playlist_items
playlist_id
video_id
Quindi, dall'esempio precedente, un utente può avere video che possono essere referenziati in playlist che possono essere creati da altri utenti. Se viene applicata l'integrità referenziale, l'utente non sarà in grado di eliminare il video a meno che non vi siano ulteriori riferimenti (su delete cascade).
Come devo implementare il database per gestire la cancellazione?
Opzione 1: non imporre l'integrità referenziale. Le playlist possono fare riferimento a video che non esistono.
Opzione 2: nascondi i dati dei video degli utenti introducendo un campo "cancellato".
Opzione 3: assegna il video a un utente speciale che diventa proprietario di tutti i video orfani.
Opzione 4: On cancella in cascata ed elimina tutte le playlist che fanno riferimento al video.
Mi sto appoggiando all'opzione 1, ma mi è sempre stato detto di imporre un vincolo di chiave esterna. Ma nel caso di interconnessione di dati utente come nell'esempio precedente, una chiave esterna potrebbe essere controintuitiva?