Cambiare un int come stringa in PHP / MySQL Schema

0

Sfondo

Sto cercando di decidere il modo migliore per gestire un cambiamento nei requisiti. Attualmente quando un amministratore viene assegnato a un ticket, al record dell'intestazione del ticket viene assegnato un proprietario e il campo ownerID viene aggiornato con il valore dell'ID che corrisponde al record nella tabella TeamMembers. Il proprietario (membro del team) viene informato quando un utente (cliente) aggiorna il ticket con un commento. Ora devo aggiungere altri membri del team al ticket in modo che vengano anche notificati.

Domanda?

I I ...

  1. Crea ID proprietario del campo ID proprietario e memorizza un elenco di ID separati da virgole in una stringa?
  2. Aggiungi un nuovo campo additionalOwnerIDs e memorizza eventuali ID aggiuntivi dopo il proprietario principale come stringa separata da virgole?
  3. Crea una nuova tabella che collega semplicemente ticketID ai proprietari assegnati e ha una riga per proprietario?
  4. Fai qualcos'altro?

Considerazioni

Desidero fornire la nuova funzionalità il più rapidamente possibile, il riutilizzo del campo esistente potrebbe sembrare il modo più semplice ma comporterebbe la modifica del tipo di schema dei dati esistenti, quindi sarà necessario uno script di migrazione per riscrivere centinaia di migliaia di righe .

L'aggiunta di un nuovo campo non richiederebbe più operazioni di migrazione, come sarebbe una stringa vuota per tutti i record esistenti e predefinita per una stringa vuota per i nuovi record.

Una nuova tabella di collegamenti sembra il modo più programmaticamente corretto (IMHO) ma richiederebbe il tempo più lungo per implementarlo e testarlo e le migrazioni sarebbero le più complicate in termini di estrazione dei proprietari di ticket esistenti nella nuova tabella. Modifica del codice per recuperare / aggiornare un proprietario per interrogare la nuova tabella. Quindi rimuovi la colonna ownerID defunta dalla tabella esistente.

Hai perso qualcosa? Quale approccio è il migliore in termini di mantenimento della base di codice in futuro?

    
posta Luke 28.07.2014 - 16:40
fonte

2 risposte

1

Hai sicuramente pensato bene a questo problema. Sono d'accordo con te che l'opzione tre è la migliore pratica; Sceglierei quell'opzione La creazione di una nuova tabella che collega molti ID di proprietario a un singolo ID di ticket ha più senso per me. È intuitivo e renderà il database più gestibile in futuro.

Alcune considerazioni sull'opzione 3:

  • Dovrai aggiornare il modo in cui un proprietario è collegato a un ticket. I miei suggerimenti sono di aggiornare la GUI per utilizzare un controllo come questo: link
  • Dovrai deprecare la creazione, l'aggiornamento e il recupero dei proprietari esistenti e aggiornarlo per creare, aggiornare e recuperare dalla tua tabella appena creata. A seconda delle informazioni che si desidera restituire, potrebbe essere necessario unirsi alla tabella Proprietario e Ticket.
  • Ora c'è più di un proprietario per biglietto. È molto probabile che esistano funzionalità che dipendono dall'avere un singolo proprietario. Dovrai scoprire questa funzionalità e tornare ai tuoi clienti con una raccomandazione sulla risoluzione di tali problemi.

Inizialmente potrebbe sembrare molto lavoro. Tuttavia, credo che sarà più facile estendere la funzionalità in seguito. Sarà anche meno una curva di apprendimento per i futuri sviluppatori.

Problemi con le opzioni separate da virgola:

  1. Non lasciare che il database faccia il suo lavoro. Il database è lì per eseguire recuperi, aggiornamenti e creazioni; è ottimizzato per fare queste cose. Memorizzare i dati come stringa significa che è necessario scrivere codice per analizzarli ed eseguire operazioni che il database deve eseguire.
  2. È difficile vedere le connessioni tra i tavoli. La tua simulazione di una relazione in codice. Sarà difficile vedere la relazione a prima vista se ci sono un sacco di voci nel campo delimitato da virgole. Ciò contribuisce a una curva di apprendimento ripida per i nuovi sviluppatori e un mal di testa se è necessario eseguire il debug in un secondo momento.
  3. Dovrai eseguire il debug delle relazioni del database tramite il codice anziché scrivere query. Si desidera essere in grado di eseguire il software ed eseguire una query SQL per verificare se la relazione è stata configurata correttamente nelle tabelle. Tuttavia, con una virgola delimitata dovrai eseguire il debug di questa relazione tramite codice anziché eseguire una semplice query SQL. Questa è una perdita di tempo e un dolore.

Sono sicuro che ci sono più motivi per non utilizzare campi delimitati da virgole in un database. Ecco alcuni per aiutare a capire perché non è una buona idea. Sono sicuro che le persone potrebbero inventare vantaggi anche per la memorizzazione di campi delimitati da virgole. Tuttavia, è mia opinione che sia una cattiva pratica memorizzare campi delimitati da virgole in un database.

    
risposta data 28.07.2014 - 17:12
fonte
1

Vai con l'opzione # 3, creando una nuova tabella. Incorporare i dati CSV in colonne ti farà venire il mal di testa lungo la strada perché avrai dati che non sono facilmente recuperabili. In questo caso, se hai incorporato un elenco CSV di utenti, ti impedirebbe di cercare facilmente sui ticket che un utente viene assegnato con una singola istruzione SQL.

    
risposta data 28.07.2014 - 16:59
fonte

Leggi altre domande sui tag