Come devo implementare campi di database personalizzati?

2

Sto costruendo un'app in cui gli utenti finali possono aggiungere campi personalizzati alle tabelle del database. Pensala come un'app CRM, dove a volte hai solo bisogno di aggiungere un campo extra alla tua tabella clienti. Praticamente tutti i CRM hanno questa caratteristica. Sto usando un database SQL tradizionale.

Devo farlo cambiando la struttura dati stessa tramite la colonna ALTER TABLE ADD? O dovrei memorizzare il contenuto del nuovo campo come coppia chiave / valore in una tabella separata, ad esempio (id, nomecampo, campovalore)?

Il vantaggio di ALTER TABLE è che è più semplice. Il vantaggio della tabella separata è che lasciare gli utenti finali ALTER TABLE mi dà i willies.

Il grande svantaggio della tabella separata è che complica notevolmente le query perché devi usare alcuni brutti join ovunque.

Ad ogni modo, come fa la maggior parte delle app?

    
posta ccleve 28.08.2018 - 23:09
fonte

3 risposte

5

Potresti diventare un po 'mongo-ish e memorizzare i campi personalizzati come JSON in un campo di testo. Versioni successive di MySQL e Postgres possono anche eseguire query su questi.

Questo significa anche che quei campi sono solo sulle righe che ne hanno bisogno, piuttosto che avere molti campi db reali pieni di null.

Potresti aver bisogno di una sorta di dizionario dei dati, magari in una tabella, quindi sai cosa fare con ogni campo personalizzato.

    
risposta data 29.08.2018 - 06:15
fonte
2

I due modi in cui l'ho visto è sia chiave / valore come hai detto, o talvolta lo sviluppatore aggiungerà solo un numero fisso di campi Custom1 , Custom2 , ... Custom10 al database . Devi solo dire al cliente che hanno un limite di 10 campi che possono usare come preferiscono.

ALTER TABLE non verrà ridimensionato. Ti ritroverai con centinaia di colonne definite dall'utente che saranno per lo più NULL e avrai problemi quando il tuo tavolo è grande e qualcuno decide di aggiungere una colonna.

    
risposta data 28.08.2018 - 23:50
fonte
2

Opzioni come li vedo: -

(Prima coppia già suggerita da Dan Pichelman)

1) Custom1..CustomNN con una tabella (contenente righe NN) per assegnare nomi e convalida significativi ai campi personalizzati.

2) Coppie valore-chiave che necessiterebbero di una tabella per definire i campi aggiuntivi e un'altra tabella per collegare la chiave primaria con questa tabella.

Entrambi questi approcci finiranno con problemi di tipo di dati, ad es. interi memorizzati in VARCHAR.

3) Architettura plug-in - come i CRM open source, si progetta l'architettura attorno ai plug-in che creeranno le loro modifiche allo schema durante l'installazione e forniranno gli strumenti per manipolarli. Che ha bisogno di utenti dalla mentalità tecnica.

4) Approccio di consulenza A - Consenti alle persone di pagare per aggiungere nuovi campi che vengono poi condivisi con gli altri utenti. Vantaggio - Ancora una sola base di codice da supportare, Svantaggio - Non è possibile caricare tanto perché non esiste esclusività, inoltre, i clienti possono aspettare che qualcun altro entri in caverna e paghi in modo che ottengano la libertà. Ci sono alcuni modi per aggirare questo.

5) Approccio di consulenza B - Personalizzi il prodotto per ogni utente disposto a pagarti e non condividere i nuovi campi con altri clienti (a meno che non paghino anche loro). Vantaggio: un elevato tasso di fatturazione oraria può addebitare a molti utenti la stessa modifica. Svantaggio: frammentazione di Codebase, gestione di chi ha pagato per cosa. Parzialmente mitigato vendendo esclusività temporanea anziché esclusività permanente, ad esempio la vostra esclusiva fino alla prossima major release.

    
risposta data 29.08.2018 - 05:23
fonte

Leggi altre domande sui tag