Creazione database con campi variabili

di il
17 risposte

Creazione database con campi variabili

Salve a tutti,
ho l'esigenza di creare la possibilità a utenti diversi di personalizzare le tabelle del database.
In pratica ogni utente dovrà avere la possibilità di creare una sua tabella, composta da campi variabili sia per tipologia sia per numero.
Queste tabelle, una volta caricate i valori (anche 100.000 records per singola tabella) dovranno essere filtrate e ordinate.

Inizialmente pensavo di creare un tabella in cui definire la struttura dei campi personalizzata.
id , id_tabella , id_campo , nome_campo, tipologia_campo, obbligatorio(y/n),ordine_campo, attivo
44 , 10 , 3 , nominativo , text , y , 1 , 1
45 , 10 , 4 , telefono , text , n , 2 , 1

poi una tabella in cui contenere i valori di ogni riga e campo
id, id_tabella, id_campo, id_riga, valore

78 , 10 , 3 , 1 , Mario
79 , 10 , 4 , 1 , +39 3395845587
80 , 10 , 3 , 2 , Fabio
81 , 10 , 4 , 2 , +39 2515548

In modo da strutturare le righe di queste tabelle in modo verticale.
Questo però mi risulta difficile da gestire con le query, infatti se volessi ordinare in modo decrescente per un campo specifico o filtrare per un campo specifico la cosa si complica in quanto avrei sempre i dati su singole righe e non su una sola riga.

In alternativa pensavo ad una tabella molto grande (es:100 campi) e associare i singoli campi alla loro posizione.

id, id_tabella, id_campo, nome_campo, tipologia_campo, obbligatorio, nome_campo_tabella_unica
44 , 10 , 3 , nominativo , text , y , campo_1
45 , 10 , 4 , telefono , text , n , campo_4

id, id_tabella, campo_1, campo_2, campo_3 ..... campo_100
78 , 10 , Mario , null , null , +39 3395845587 , null .....
79 , 10 , Fabio , null , null , +39 2515548 , null .....

In questo modo avrei le righe in orizzontale e devo solo identificare ogni campo_x a cosa corrisponde.

Oppure ditemi voi che altri metodi usereste. Database No-SQL?

Un'altra problematica è che gli utenti possono creare tipo 3 tabelle e collegarle tra loro dove per esempio un campo prende i valori dal campo di un'altra tabella.
Per chiarire faccio questo esempio.
Potrei avere un'altra tabella dinamica con la lista delle province italiane e associare ad ogni utente la sua provincia di residenza.

Vi ringrazio per qualsiasi spunto vogliate suggerire.
Non sono un esperto di database, ho sempre lavorato con MySQL e vorrei trovare la giusta strada, anche in relazione alle performance.

Grazie.

17 Risposte

  • Re: Creazione database con campi variabili

    Sei sicuro di avere analizzato bene il problema? L'esigenza che dici di avere non mi convince. Nessun utente delle mie applicazioni si mette a creare tabelle personalizzate.

    Insomma, parti descrivendo il vero problema che risolve la tua applicazione, non da quello che pensi sia la soluzione (che devi implementare).

    Non a caso hai difficoltà con le query ...
  • Re: Creazione database con campi variabili

    Il mio problema è che devo dare la possibilità agli utenti di creare archivi , tabelle , database (chiamiamola come vogliamo) personalizzati.

    Gli utenti dovranno gestire informazioni diverse l'uno dall'altro.

    Per esempio un'utente potrebbe voler gestire una tabella di 20 campi per salvare il suo listino prodotti.
    Un'altro utente invece potrebbe voler gestire le anagrafiche dei suoi clienti.
    Un'altro potrebbe dover gestire la lista di clienti associata ad una lista di macchinari/strumenti che sono stati dati in prestito e quindi creare una sorta di relazione tra cliente e lista attrezzatura con data consegna e scadenza del prestito.

    Per questo mi serve un sistema flessibile, in quanto oggi non conosco esattamente queste esigenze.

    Oppure oggi posso immaginare che un'anagrafica sia composta da n campi e domani nasce l'esigenza di avere un nuovo campo.

    A me interessa capire la logica che dovrei usare per creare questo sistema flessibile.

    Se posso descrivere la mia applicazione deve essere un "applications creator"
  • Re: Creazione database con campi variabili

    Non si e' ancora capito quale sia il problema fondamentale.

    Hai descritto ESATTAMENTE quello che fa NORMALMENTE un DBMS!!!!

    A parte la terminologia,che dipende da DBMS a DBMS (chi lo chiama catalogo di sistema, chi database dei metadati, ...) OGNI DBMS ha un database dedicato alla gestione di queste informazioni.

    Quando un utente crea un DATABASE, e all'interno di questo una TABELLA, queste iformazioni sono memorizzate nel database dei metadati!

    Quindi, che cos'e' che vorresti fare?
  • Re: Creazione database con campi variabili

    Secondo me, sei molto fuori strada.

    Non è possibile realizzare un'applicazione "verticale" generica, uno ci fa la fatturazione, l'altro ci fa la gestione dell'autosalone, l'altro ancora ci gestisce il salone di bellezza. E ognuno si fa le proprie tabelle, relazioni, ecc... Andiamo ...

    Comunque, auguri.
  • Re: Creazione database con campi variabili

    @oregon, quello che vuole fare e' implementare un DBMS usando un DBMS
  • Re: Creazione database con campi variabili

    oregon ha scritto:


    Nessun utente delle mie applicazioni si mette a creare tabelle personalizzate.
    Appunto, delle tue.

    La soluzione è ben più banale di quello che sembra: ti occorre un compilatore a runtime di query, parametrizzato.
    In sostanza data una tabella generica, diversa per ogni cliente, avrai un modulo che legge da un file di configurazione i campi che vuoi far selezionare.

    Leggendo la configurazione genererai i vari componenti visuali relativi ai campi, con gli opportuni filtri SQL, ordinamenti e così via
    agevolo un piccolo esempio
    1.jpg
    1.jpg

    In tal modo gli utenti possono creare le loro tabelle, gestire il relativo file di configurazione (quali campi selezionare nella query, query predefinite) et voilà.

    Normalmente imporrai l'esistenza di un campo specifico di join tra la tabella principale e le tabelle personalizzate; nell'applicazione avrai un "qualcosa" (evento, trigger etc) che, all'inserimento di un record nella tabella standard, automaticamente inserisca un record nella tabella utente, settando opportunamente il campo di join.

    Analogamente, nell'applicazione, avrai degli eventi che, al mutare del record della tabella principale, "refresherà" quella dell'utente.

    Diciamo in tutto un pomeriggio di lavoro.
  • Re: Creazione database con campi variabili

    oregon ha scritto:


    Secondo me, sei molto fuori strada.

    Non è possibile realizzare un'applicazione "verticale" generica, uno ci fa la fatturazione, l'altro ci fa la gestione dell'autosalone, l'altro ancora ci gestisce il salone di bellezza. E ognuno si fa le proprie tabelle, relazioni, ecc... Andiamo ...
    E' banale, per i motivi sopra spiegati.
    Non del tutto generica, ma con tabelle generiche specifiche per ogni ambito sì, si trovano in qualsiasi ERP anche di fascia bassa.

    Esistono delle tabelle "madri" (pratiche, clienti, documenti) cui si possono "appiccicare" le tabelle specifiche del cliente.
    Ad esempio nel caso dei parrucchieri è normale avere le schede delle tinture e delle varie acconciature, per ogni cliente.

    Tempo di implementazione (avendo ben progettato tutto il resto, come sopra meramente accennato): 30 minuti.
  • Re: Creazione database con campi variabili

    +m2+ ha scritto:


    30 minuti.
    Anche 28
  • Re: Creazione database con campi variabili

    +m2+ ha scritto:


    oregon ha scritto:


    Nessun utente delle mie applicazioni si mette a creare tabelle personalizzate.
    Appunto, delle tue.
    Non fare il solito sbruffone ... con gli altri attacca, con me no.
  • Re: Creazione database con campi variabili

    oregon ha scritto:


    +m2+ ha scritto:


    30 minuti.
    Anche 28
    Se sono in studio anche meno, la macchina è molto veloce.
    Ti occorrerà un qualcosa di questo genere, tanto per dare un'idea da declinare poi nel linguaggio specifico che si utilizza.
    procedure AggiungiCampoSQL(
     i_senderz:tcomponent;
     i_myedtEnter:Tnotifyevent;
     i_myedtExit:Tnotifyevent;
     i_myedtSQLKeyDown:tkeyevent;
     i_myedtSQLKeyPress:tkeypressevent;
     i_myedtFiltroSqlChange:TNotifyEvent;
     var i_pannello:tpanel;
     var io_quanticampisql:integer;
     i_stepy:integer;
     i_starty:integer;
     i_sizexcampi:integer;
     i_sizexcombobox:integer;
     i_stepxlabel:integer;
     i_sizexlabel:integer;
     i_startx:integer;
     i_myMaxY:integer;
     var i_mySortSQL: TComboBox;
     var io_myRigaSQL:integer;
     var io_mycolonnaSQL:integer;
     var io_myarrayCampiSQL:array of campoSql;
     i_nomecampo:string;
     i_etichetta:string;
     i_confronto:string;
     i_isdata:boolean;
     i_isscalare:boolean;
     i_isJoin:boolean;
     i_tabellaSlave:string);
    
    Essenzialmente terrai un numero massimo di campi verticali che vuoi mantenere, a seconda della dimensione del pannello che li ospiterà.
    Puoi selezionarne anche di più, se attivi una barra di scorrimento verticale (ma tipicamente non piace ai clienti).
    Ovviamente dovrai tener conto, nella generazione delle etichette, combobox, editbox, di un font personalizzato,e di un fattore moltiplicativo di scala, per l'utilizzo su monitor ad altissima risoluzione, piuttosto che su tablet e così via.
    Insomma normali banalità.
  • Re: Creazione database con campi variabili

    oregon ha scritto:


    +m2+ ha scritto:


    oregon ha scritto:


    Nessun utente delle mie applicazioni si mette a creare tabelle personalizzate.
    Appunto, delle tue.
    Non fare il solito sbruffone ... con gli altri attacca, con me no.
    Non faccio lo sbruffone, segnalo che nessun cliente delle TUE applicazioni non fa questo e quest'altro.
    Ciò non implica affatto che NESSUN cliente / applicazione lo faccia o lo ritenga utile.

    Come detto è lavoro a livello ragioniere programmatore, se volessi fare lo sbruffone tirerei fuori cose assai più carine, come il calcolo medio della velocità di scrittura del singolo utente, per capire quando finisce di scrivere qualcosa in un campo per fargli fare automaticamente la query, risparmiando di dover premere un tasto.
    Nell'esempio precedente è il checkbox "filtra live".

    Funziona molto bene con le ragioniere "attempate" che avevano dattilografia come materia obbligatoria.

    Pace e bene.
  • Re: Creazione database con campi variabili

    Scusate forse non ho spiegato bene quello di cui ho bisogno.
    Immaginate di creare una cosa (più in piccolo) di questa applicazione "https://airtable.co"

    Quello che mi sembra di capire dalle risposte è che ogni cliente che crea la sua tabella dovrebbe crearla fisicamente nel database.
    Quindi non conviene avere una tabella globale per gestire tutte queste informazioni.

    Quindi meglio avere 100 tabelle da 5.000 righe che 1 tabella da 500.000 righe. corretto?
  • Re: Creazione database con campi variabili

    ecsolution ha scritto:


    Quello che mi sembra di capire dalle risposte è che ogni cliente che crea la sua tabella dovrebbe crearla fisicamente nel database.
    E certo, dove altro vuoi crearla?
    Quindi non conviene avere una tabella globale per gestire tutte queste informazioni.

    Quindi meglio avere 100 tabelle da 5.000 righe che 1 tabella da 500.000 righe. corretto?
    Dipende, essenzialmente dalla necessità di elaborare tutte le informazioni contemporaneamente.

    Se vuoi che ogni utente possa creare una sua tabella, come detto, ti basta rendere parametrizzate le interrogazioni.

    L'utente pippo avrà la tabella tabellapippo, e l'utente pluto avrà la tabellapluto.
    Nella tabellapippo ci saranno magari nome,cognome, indirizzo

    Nella tabellapluto ci saranno altezza, peso, età

    Genererai due file di configurazione: configurazionepippo e configurazionepluto.
    In configurazionepippo ci metterai che so nome,cognome
    in configurazionepluto altezza e peso.

    Ora quando l'utente pippo si logga, leggerai da "configurazionepippo" che egli vuol fare le query solo sui campi nome e cognome.

    Genererai "qualcosa" a runtime (una griglia o quello che ti pare) che riporterà ad esempio TUTTI i campi (nome,cognome, indirizzo). Li determinerai a runtime dalla tabella medesima (con mysql DESCRIBE oppure accesso alla tabella dei metadati).

    Sempre a runtime genererai due "qualcosa" (combobox, editbox, stica..zzi a seconda del linguaggio e dell'ambiente) dove ci metterai nome e cognome (li hai letti dal file di configurazione).

    Ora quando l'utente scrive qualcosa nel primo (nome) "qualcosa" creerai qualcosa del tipo

    select * from tabellapippo where nome LIKE "%"+valoreeditboxnome+"%"

    Se mette sia nome che cognome aggiungerai "OR cognome like ..."
    e così via.

    Chiaro? La "chiave" è creare non in modo fisso, ma dinamico, le aree in cui l'utente inserirà i dati da ricercare, e quelli dove verranno mostrati.

    In versione "brutale" puoi far automatizzare, cioè prendere TUTTI i campi della tabella, senza necessità di configurazione.
    Questo va bene se i campi sono pochi, meno bene quando sono tanti.
    Ad esempio potresti avere una tabella con 100 campi, ma di cui ti interessa far ricerche solo su 10 di essi.
  • Re: Creazione database con campi variabili

    Per inciso puoi ottenere l'elenco dei campi di una tabella così (avendo le relative autorizzazioni)
    SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.columns WHERE TABLE_SCHEMA = "nomedeldatabase" AND TABLE_NAME = "tabellapippo"
    
Devi accedere o registrarti per scrivere nel forum
17 risposte