La creazione e l'eliminazione continue delle tabelle sono un segno di un difetto architettonico?


11

Di recente ho avuto una discussione con uno sviluppatore che ha affermato che durante lo sviluppo del programma, creano e cancellano regolarmente tabelle e colonne su base regolare mentre lavorano su nuove funzionalità e cose giustificate dicendo che questo è normale quando si utilizza un processo di sviluppo agile.

Dato che la maggior parte del mio background è in un ambiente di sviluppo a cascata, mi chiedo se questo sia effettivamente considerato corretto in fase di sviluppo agile, o se questo potrebbe essere un segno di un problema di fondo, o con l'architettura del programma o con il loro seguito del processo agile.


Un commento sul database, l'ultima volta che è stato verificato ci sono oltre 700 tabelle e ho sentito dire da altri che "non c'è abbastanza tempo per riformattare".
rjzii,

24
700 tavoli e non abbastanza tempo per refactoring? Sento l'odore del fallimento fin qui.
Adam Crossland,

7
700 tavoli USATI o 700 tavoli molti dei quali sono orfani?
Ben Brocka,

1
@AdamCrossland Seriamente ... Ooh That Smell di Lynyrd Skynyrd. Ma su una nota seria, le tabelle denormalizzate a volte sono una buona scelta di progettazione su lettura pesante o database che hanno un carico pesante di reportistica.
maple_shaft

1
@maple_shaft Certo, qualsiasi tecnologia può essere abusata, come qualsiasi altra cosa che devi valutare i pro / contro e testare, testare, testare. Le viste materializzate, tuttavia, possono offrirti un out se ti ritrovi a denormalizzare le tue tabelle. Penso che il tuo punto sia solo un'ulteriore ragione per avere un DBA o almeno uno sviluppatore con un forte DB-fu sul personale per ritirare le redini quando tutti gli altri stanno caricando in avanti con un design chiaramente scadente. Il mio miglior lavoro non è arrivato durante la programmazione o la progettazione, ma impedendo ad altri di prendere decisioni orribili e orribili.
Mike Cellini,

Risposte:


21

Mi sta diventando sempre più evidente ogni giorno che "agile" sta diventando un sinonimo di mal concepito, caotico, frettoloso e comodo. E nessuna di queste cose è compatibile con un approccio Agile come lo capisco.

Avere un processo Agile efficace e ripetibile non è facile e non credo che riduca intrinsecamente la quantità totale di lavoro da svolgere anche se può portare a prodotti migliori.

Se hanno detto che non hanno il tempo di "refactoring" del database, probabilmente non hanno nemmeno il tempo di impostare il versioning e la migrazione per il database. Probabilmente non si sono presi il tempo di creare una serie di test funzionali per questo. Tutte queste cose sono ciò a cui penso quando penso a un solido processo Agile che punta al successo.

Alla fine, Agile è solo una parola. Quello che stai facendo ogni giorno determina se avrai successo o meno.


2
Avere un processo Agile efficace dovrebbe effettivamente significare un lavoro più anticipato a causa della ripetuta attenzione alla fornitura di software funzionale dopo ogni sprint. Se fatto bene, porta a maggiori possibilità di successo. La cascata è in realtà molto più efficiente se si presume che i requisiti siano statici e che le risorse del progetto non commettano errori. Questa è fantasia nella maggior parte delle situazioni però.
maple_shaft

1
@maple_shaft, proprio così. Essere agili non rimuove il duro lavoro dalla costruzione di prodotti.
Adam Crossland,

2
Ho la sensazione che questa squadra stesse usando un approccio a cascata, sarebbe altrettanto caotico e qualsiasi richiesta di modifica sarebbe un disastro.
JeffO

Ben detto, Jeff O.
Adam Crossland

11

Sebbene non sia insolito creare e eliminare tabelle man mano che il progetto evolve, potrebbe essere necessario un po 'di pulizia per assicurarsi che il database stia effettivamente utilizzando tutte quelle tabelle.

Sì, Agile ha a che fare con il refactoring, ma se ora stanno dicendo che il sistema è troppo grande per il refactoring, hanno smesso di fare Agile e ora stanno solo programmando Cowboy. Al team di sviluppo non piacerà essere chiamato così, ma è quello che stanno facendo. In sella alla gamma sparare a tutto ciò che si muove.

Un DBA ti aiuterà, assicurati solo di ottenere un DBA che comprenda lo sviluppo e lo sviluppo Agile. Il tuo team di sviluppo deve essere reintrodotto, non gettato in prigione.


5

In generale, spesso creare nuove tabelle e aggiungere nuove colonne è molto normale in un processo in cui la programmazione e l'amministrazione del database non sono strettamente separate. Una nuova funzionalità potrebbe creare nuovi dati che devono andare da qualche parte. Prova troppo rigorosamente per evitarlo e finisci con un modello di piattaforma interna .

Un software ben scritto difficilmente nota questi nuovi oggetti di database, quindi nulla si rompe solo a causa di una nuova colonna in qualche tabella.

D'altra parte, rilasciare regolarmente colonne o persino tabelle è sospetto. Una nuova funzionalità non ha mai bisogno di una tabella rimossa, quindi questo potrebbe essere un segno di persone che lavorano completamente senza piano.


1
La creazione di nuove tabelle e colonne non mi disturba quando è giustificato, ma è stato sottolineato che la rimozione di tabelle (e colonne per quella materia) in genere significa che alcuni lavori sono stati persi a causa di una pianificazione inappropriata o di qualcun altro che decide la funzionalità non era necessaria dopo tutto. Allo stesso modo, il numero di tabelle di taglio è una preoccupazione a causa della mancanza di normalizzazione in esse.
rjzii,

Esattamente. Non preoccuparti per il gran numero di tavoli, la maggior parte di essi è comunque inutilizzata e forse verranno abbandonati presto. SCNR
user281377

Bene, il problema è che sono tutti usati, anche se è solo per un singolo record.
rjzii,

4

Se il tuo database può essere facilmente aggiornato e migrato e hai i test per dimostrare che cambiare le cose non ha rotto le cose, probabilmente avrai avviato un processo piuttosto agile.

Alla luce dei commenti - generalmente per effetto di questi sono un mucchio di cowboy che si giustificano come agili - corrono urlando. Veloce. E pubblica tutto ciò che puoi su thedailywtf.com in modo che tutti possiamo goderti il ​​tuo orrore.


La cosa triste è che il database non può essere facilmente aggiornato, migrato e, nella migliore delle ipotesi, esistono test limitati. Gli sviluppatori sovrascrivono spesso le modifiche apportate da altri sviluppatori.
rjzii,

5
Sicuramente programmazione Cowboy quindi. Se hai un team di gestione dietro questo sforzo "Agile", assicurati di ratificare questo team con loro che stanno abusando di Agile e stanno solo andando in tilt.
Bill Leeper,

1
@RobZ Agile non è una scusa per una scarsa copertura dei test unitari e una cattiva progettazione del database. Sembra un disastro.
maple_shaft

2
ugh! non versione !!! non c'è da stupirsi che sia un casino. Rabbrividisco al pensiero di come sia il codice dell'app.
ozz,

4
Fondamentalmente questa squadra non sta facendo nulla di agile, sono solo una squadra AdHoc. Se è in atto una struttura di gestione, è possibile sollevare anonimamente o di persona preoccupazioni nella catena. Di 'loro che stai vedendo un enorme disastro nel database, mancanza di test e pratiche improprie utilizzate per gestire il codice. Questa squadra è diretta verso un grande FAIL.
Bill Leeper,

3

Come la maggior parte delle risposte qui su StackExchange, la risposta dovrebbe essere "dipende". Nello sviluppo agile, i requisiti e le specifiche vengono scoperti durante l'implementazione.

Tuttavia, dato lo sviluppo agile, quando un modello relazionale è correttamente normalizzato, l'aggiunta di nuovi attributi alle relazioni dovrebbe raramente essere una necessità, le nuove entità dovrebbero generalmente riferirsi a quelle più vecchie, dato un modello adeguato.

La maggior parte degli sviluppatori non normalizza i propri DB a causa di vincoli di tempo, pigrizia, incompetenza o complessità delle query. La rinormalizzazione richiede il trasferimento di dati esistenti, la modifica dei DAO, ecc. Ecc. Che genera un fattore di rischio.


A che punto del processo agile appare magicamente il modello adeguato per tutte le future richieste di modifica?
JeffO

Dopo aver studiato correttamente il dominio. Esiste un numero limitato di proprietà che definiscono completamente un'entità. Alcuni esempi (sempre più complessi): un punto 2D è completamente definito da due coordinate, un indirizzo è completamente definito da un paese, una versione dei campi e una realizzazione di un insieme di campi indirizzo definiti da un'altra entità (usando un id paese, una versione e vincoli).
Dibbeke,

@Dibbeke: E poi hai problemi di business come il trattamento dell'UE (27 paesi) come un singolo paese nei casi X, Y e Z. O il trattamento degli stati degli Stati Uniti come paesi. O la realizzazione aziendale che alcune voci DB hanno 2 rappresentazioni di indirizzo per un singolo indirizzo.
Salterio

3

Per rispondere alla tua domanda, no, non è normale in un processo Agile.

Dove può sembrare che derivi da un atteggiamento Agile è dal ciclo di progettazione / sviluppo / test di breve iterazione di Agile e dall'enfasi di Agile su soluzioni leggere che soddisfano i requisiti noti, ma sono ben strutturate per essere in grado di soddisfare i nuovi requisiti con cambiamento minimo. Date queste due cose, potresti dire che uno sviluppatore, non sapendo cosa potrebbe venire giù la linea ma sapendo che la sua modifica non dovrebbe avere un impatto sul DB in un modo che non può essere annullato, apporta semplicemente le modifiche necessarie allo schema nel Il modo "più leggero" possibile, e poi a intervalli diversi set di cambiamenti "leggeri" verranno trasformati in qualcosa di più permanente e stabile.

Detto questo, non ho ancora lavorato con uno sviluppatore che si è abbonato alla teoria e alla metodologia Agile e ho anche pensato che la creazione e l'eliminazione sistematiche di tabelle nello schema fossero necessarie per qualsiasi motivo. Agile non significa slap-dash o bolt-on. Se ti viene fornita una storia che richiede l'aggiunta di un nuovo campo di dati appartenenti a un particolare record, aggiungi il campo alla tabella. Se quella modifica rompe qualcosa, capisci perché e apporti altre modifiche che potrebbero essere necessarie (posso pensare a pochissime cose che potrebbero rompersi aggiungendo una colonna a un DB interrogato; se si rompe con questo tipo di modifica, tu hanno problemi più grandi). Il refactoring è normalmente limitato al codice; la modifica dello schema è in genere un processo più coinvolto rispetto alla modifica del codice, pertanto quando si verificano modifiche dello schema, di solito vengono eseguite con maggiore attenzione, e almeno qualche attenzione prestata alla conoscenza della direzione futura del progetto. Dover ristrutturare tutto o parte del database indica un fallimento fondamentale della progettazione; essere Agile non significa che non ci sia un "piano generale" di architettura di base e regole di progettazione da seguire durante la costruzione organica del programma e della struttura dei dati.

Ora, ci sono casi in Agile in cui ciò che "conosci" ora sarà contraddetto da ciò che imparerai in seguito. Supponi di avere un requisito secondo cui il tuo sistema deve avere un indirizzo per ogni persona. Poiché si tratta di una relazione 1: 1 e i dati saranno necessari nella maggior parte dei casi, è sufficiente aggiungere i campi Indirizzo alla tabella Persona. Una settimana dopo ricevi un requisito secondo cui una persona può avere più di un indirizzo. Ora è una relazione 1: N e per modellarla correttamente è necessario annullare le modifiche precedenti, suddividendo i campi in una nuova tabella degli indirizzi. Questo non è di routine, soprattutto tra gli sviluppatori senior. Uno sviluppatore esperto vedrà che una persona ha un indirizzo, li considera come concettualmente separati e crea una tabella persona e una tabella indirizzo, collegando la persona all'indirizzo con un riferimento FK a un indirizzo ID. Uno schema come questo è più semplice da modificare in caso di modifica della natura della relazione; senza creare o eliminare intere tabelle di dati "ampie", la relazione tra Persona e Indirizzo può essere facilmente modificata da 1: 1 a 1: N a N: N.


2

Non ci si concentra molto sulla progettazione in anticipo quando si lavora con Agile, quindi non vedo questo come un grosso problema, sicuramente per la prima versione.

È difficile commentare un sistema che ha 700 tabelle che non ho visto, potrebbe averne bisogno tutte, ma potrebbe anche accadere che il database non sia stato gestito abbastanza bene.

Anche sotto agile, per un grande sistema, è abbastanza comune avere ancora qualcuno / team responsabile dello schema.


2

Se apportano frequentemente tali cambiamenti, in particolare eliminando tabelle e colonne in applicazioni live, ciò sembra un segno di inesperienza. Non ha nulla a che fare con qualunque processo sostengano di seguire. "Agile" non è una scusa per non sedersi e pensare ai dati che è necessario archiviare e al modo in cui sono correlati prima di iniziare a martellare il codice. Se scoprono che stanno modificando più del 10-20% della struttura iniziale, per me questo è un indicatore del fatto che non stanno riflettendo o non hanno molta esperienza nell'analisi dei requisiti e nella progettazione di database, e quindi ottengono semplicemente molto sbagliato all'inizio.


2

Anche se sembra che la tua squadra sia semplicemente un codice da cowboy, in realtà non dovrebbe esserci nulla di sbagliato nel refactoring del codice O dei database. Non è lavoro perso - si sta adattando a una realtà appena appresa.

Suggerirei che il team ha bisogno di un sandbox per provare le modifiche, fare alcuni test, rimbalzare gli utenti e decidere se hanno senso. A quel punto, l'integrazione dei cambiamenti che hanno senso - con adeguati test di regressione - nel tuo schema dovrebbe andare bene.


1

Agile riguarda la programmazione, i database non sono codice. Cambiare un database dovrebbe essere trattato come rimodellare una casa. Le persone in qualche modo hanno avuto la convinzione che i mezzi agili agiscano ora in un piano successivo, il che è completamente falso. Anche con metodi agili è necessario dedicare tempo alla pianificazione, soprattutto per qualcosa di importante come la progettazione di database.


5
I database non sono codice, ma lo schema è e deve essere trattato come tale. Dovrebbe essere anche versione e controllo del codice sorgente. Voglio sottovalutare questo, ma sono troppo d'accordo con il resto della tua risposta.
maple_shaft

6
Agile non riguarda la codifica. Riguarda il processo di sviluppo del software, che include sicuramente database se il software funzionante dipende dal database. Detto questo, concordo con la tua affermazione che Agile non significa "agisci ora pianifica più tardi".
Eric King,

@maple_shaft solo perché uno schema db è trattato come il codice non lo rende codice. gli animali domestici sono trattati come persone, ma ciò non li rende persone
Ryathal,

3
Che si tratti di un codice o meno, deve essere pianificato. La modifica di un database deve essere considerata come modifica del codice insieme a considerazioni per i dati esistenti. In realtà ci vuole più pensiero e pianificazione.
JeffO

1

Il mio ultimo lavoro è stato in una squadra come questa. Quando si utilizza un processo agile, i requisiti cambiano. A volte le modifiche significano che un'entità esistente ha bisogno di un nuovo attributo risultante in una nuova colonna in una tabella esistente o è necessaria un'intera nuova entità risultante in una nuova tabella con relazioni con le tabelle esistenti. Questo tipo di modifiche viene fornito con il territorio e non può essere ignorato solo perché non si desidera toccare lo schema. Il successo è determinato dal mantenimento dell'integrità dei dati durante la migrazione da una versione del database alla successiva e corretta verifica dell'unità.

Cerca solo di non apportare modifiche inutili al tuo schema. Ad esempio, se una funzione richiede la creazione di una nuova tabella, assicurarsi di essere soddisfatti della definizione di tale tabella prima di effettuare il check-in e distribuirla nel proprio ambiente di test. Dover annullare una modifica allo schema del database dopo la migrazione dei dati può essere doloroso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.