Come eliminare i dati utente a cui fa riferimento un altro utente?

3

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?

    
posta user3804927 25.01.2016 - 03:53
fonte

1 risposta

3

Il mio suggerimento è simile al # 3 ma con una differenza.

Mentre su # 3 suggeriamo di non eliminare affatto il video ma spostandolo su un altro utente che sarà il proprietario di tutti i video orfani, suggerisco questo:

  1. Dovrebbe esistere un video speciale chiamato "video eliminato", il cui proprietario è "Proprietario del video eliminato". L'ID di quel video speciale è, ad esempio, 1.
  2. Come PLAYLIST_ITEM è una tabella molti-a-molti tra USER_VIDEO e VIDEO_PLAYLIST (i nomi delle entità devono essere singolari), quando un utente elimina un video il programma aggiorna prima le righe in PLAYLIST_ITEM che fanno riferimento a video e li cambia per fare riferimento all'ID video 1 ("video eliminato").
  3. Inserisci in una tabella chiamata DELETED_VIDEO_COMMENT un commento come "Video del gattino felice cancellato dal proprietario". Sarebbe una tabella uno a uno con una chiave esterna a PLAYLIST_ITEM , che conterrebbe solo una riga che spiega il nome del video eliminato, a cui si fa riferimento in precedenza.
  4. Dopo che tutti i riferimenti al video da eliminare sono scomparsi, quindi cancellarlo.

I vantaggi:

  1. I proprietari delle playlist non vedono le loro playlist ridotte senza una ragione apparente.
  2. I possessori di playlist vedono un "video eliminato" tra i loro elementi di playlist o ancora meglio "Happy Kitten (cancellato dal proprietario)".

ADDENDUM.

Quando i proprietari delle playlist eliminano i video eliminati dalla loro playlist, la riga in DELETED_VIDEO_COMMENT li accompagna.

    
risposta data 25.01.2016 - 06:31
fonte

Leggi altre domande sui tag