Come aggiornare una riga nel database senza ID?

1

Ho una tabella con la seguente struttura:

Col1 | Col2  | Col3
A    | B     | C
A    | C     | B
E    | D     | C

La chiave primaria è (Col1, Col2, Col3).

Ottengo i dati in un altro progetto e li visualizzo in vista con una griglia. Quando l'utente modifica una riga nella griglia, ad esempio: A, B, C - > A, B, E, ottengo (A, B, E) e provo ad aggiornare il database. Ma non so quale riga deve essere aggiornata se non ho l'originale (A, B, C).

Qual è il modo corretto per risolvere questo problema? Devo creare un ID temporaneo sul mio secondo progetto? Non credo che creare un ID specifico nel database sia una buona idea.

    
posta Alex 10.07.2014 - 14:03
fonte

2 risposte

4

Questo è uno dei tanti casi in cui dovresti abbracciare il male minore che è Chiavi surrogate . Qualunque tabella abbia una chiave primaria di (col1,col2,col3) dovrebbe avere una chiave aggiuntiva creata dal sistema, come un'identità o GUID.

Non si specifica il tipo di dati di (col1,col2,col3) , ma se per qualche motivo sei allergico alle chiavi surrogate puoi abbracciare il male leggermente più grande di una "chiave combinata", dove invece di un valore creato dal database il tuo campo chiave univoco deriva da altri campi. (In questo caso, sarebbe qualcosa di simile a CONCAT(col1, '-', col2, '-', col3) ).

Se nessuno dei due precedenti è pratico, ti verrà lasciato il più grande malumore di dover specificare manualmente tutte e tre le colonne ogni volta che esegui una query su un record. Ciò significa che qualsiasi altro oggetto o tabella che fa riferimento a questo avrà bisogno di non avere uno, ma tre distinti campi per identificare il record di cui stai parlando.

Idealmente, btw, avresti qualche chiave aziendale nei dati effettivi che puoi garantire in base al design: saranno unici, in continua evoluzione e mai vuoti. (O almeno cambiando così raramente che il db può gestire gli aggiornamenti in cascata abbastanza bene.)

Puoi comunque utilizzare una chiave surrogata per le prestazioni in questo caso, ma questo è un dettaglio di implementazione piuttosto che un requisito di modellazione dei dati.

    
risposta data 10.07.2014 - 14:30
fonte
2

Per aggiornare una riga, è necessario sapere quale riga aggiornare: in questo caso è necessario memorizzare la chiave originale da qualche parte. È possibile duplicare i dati delle chiavi in colonne nascoste nel controllo griglia, oppure associare una tripla (o una struttura) dei dati a ogni riga.

Ciò che è importante è che la chiave per ogni riga sia salvata da qualche parte che non può essere modificata dall'utente (o persino vista dall'utente). Questo si applicherà allo stesso modo se si utilizza una colonna Identity sul proprio DB - sarà comunque necessario memorizzarlo, non lasciare che l'utente lo modifichi e utilizzarlo per fare riferimento alla riga che viene modificata.

Quando aggiorni, devi aggiornare la chiave nella tua riga - se stai usando una colonna id questo non cambierà, ma se usi le 3 colonne, quando l'utente cambia i dati in essi il DB viene aggiornato ma anche la chiave di riferimento nella tua griglia deve essere aggiornata: pensa cosa succede se l'utente le modifica nuovamente.

    
risposta data 10.07.2014 - 14:30
fonte

Leggi altre domande sui tag