Qual è il modo corretto di modificare / aggiornare oggetti molti-a-molti in DB?

3

Ho spazio di archiviazione (3 tabelle nel database):

  • films { id : int, film : stringa}

  • genres { id : int, genre : stringa},

  • films_genres { film_id : int, genre_id : int, probability : int (%)}
    ( film_id , genre_id ) è UNICO KEY (chiave composta).

Ad esempio:

films = 
{
    1 : 'Some film 1',
    2 : 'Some film 2'
}

genres = 
{
    1 : 'comedy',
    2 : 'action',
    3 : 'cartoon'
}

films_genres = 
{
    (1, 1, 100),
    (1, 2, 50),
    (1, 3, 70),
    (2, 1, 50),
    (2, 3, 100)
}

Inoltre ho modulo web per modificare / aggiornare i generi cinematografici e le loro probabilità in cui posso insert nuovi generi, delete e update generi esistenti.

Suggerisci meglio di 2 modi per modificare / aggiornare la tabella films_genres tramite modulo di modifica Web e SQL?:

1) Se voglio MODIFICARE i generi di film con probabilità nel modulo di modifica web, posso AGGIORNARE entrambi i campi genre (genre_id) e probability tramite query SQL per tabella films_genres , ma penso che sia un cattivo modo . Posso anche INSERIRE, CANCELLARE i generi di film con probabilità tramite SQL.

2) Se desidero modificare i generi di film con probabilità nel modulo di modifica Web, posso AGGIORNARE solo probability e non genre (genre_id) tramite query SQL per tabella films_genres . Inoltre posso INSERIRE, CANCELLARE i generi di film con probabilità tramite SQL. E penso che questo sia buono modo .

    
posta user238467 25.07.2016 - 00:45
fonte

1 risposta

2

Penso che ci sia una terza alternativa.

Dovresti considerare che la tabella films_genres ha una chiave primaria che è un composto (chiave) che comprende sia film_id insieme a genre_id, e quindi gestire gli aggiornamenti della tabella films_genres da quella prospettiva.

In altre parole, dovresti considerare che la tabella dei film-generi, in un certo senso, ha solo due attributi di primo livello: (a) la chiave primaria e (b) le probabilità - dove questa chiave primaria è un composto chiave composta da due colonne: film_id e genre_id.

Quindi, è possibile aggiornare la voce di probabilità nella tabella dei generi di film per una determinata riga che ha una chiave composta di film-id / genere-id (senza necessariamente cancellare una voce diversa). Va perfettamente bene avere più file di film-generi per ogni film (o qualsiasi genere).

Questa terza alternativa è in contrasto con le tue prime e seconde alternative:

1) I can update both of fields in films_genres: genre (genre_id) and probability.

Dovresti indirizzare / individuare / identificare le righe nella tabella films_genres usando la chiave primaria completa, che è una chiave composta, non solo la colonna films_id da sola. Righe con lo stesso film_id ma diverse genre_id sono righe separate che non devono necessariamente essere aggiornate insieme a causa di un altro aggiornamento in quella tabella che coinvolge lo stesso film_id.

2) I can update only probability of current film genre and not genre (genre_id) in films_genres. However if I want to update some film genre (genre_id) I need delete the old one: (film_id, genre_id_old, probability_old) and then insert a new one: (film_id, genre_id_new, probability_new).

Dovresti indirizzare le righe nella tabella films_genres usando la chiave composta, non solo la colonna films_id da sola. Righe con lo stesso film_id ma diverse genre_id sono righe separate che non devono necessariamente essere aggiornate insieme. Un film può avere più righe di film_genre avendo diversi generi_id, quindi non è necessario eliminarne uno per aggiungerne un altro.

Se esiste già una determinata chiave primaria films_genres, allora si "aggiorna", altrimenti si inserisce. (Ricorda, qui per chiave primaria, intendo la chiave composta composta da film_id + genre_id.) Non è necessario eliminare a meno che tu non voglia rimuovere la probabilità per la chiave composta.

    
risposta data 25.07.2016 - 06:50
fonte

Leggi altre domande sui tag