2010-11-11 22 views
5

Sto cercando di trovare un tutorial che mi guidi su come funzionano i campi personalizzati basati su utente. Come nei siti di sondaggi, dove consentono agli utenti di creare campi personalizzati e archiviarli e, soprattutto, di memorizzare i dati immessi attraverso tali campi.Come memorizzare campi utente personalizzati nel database

Sto cercando qualcosa che descriva come questo viene fatto sul database. Sto avendo un po 'di problemi a trovare un modo che non richiederebbe per sempre il recupero di questi dati una volta che gli utenti dovessero estrarlo nei file excel/cvs.

risposta

3

Il Entity-Attribute-Value model viene normalmente utilizzato per gestire questo scenario in un database relazionale. Una rapida ricerca di "modello EAV" produrrà più informazioni di quante ne saprai cosa fare.

+0

'Una ricerca rapida di "modello EAV"' si spera includerà la raccomandazione che dovrebbe essere evitato a meno che non ci sia alternativa - è molto flessibile, ma non scala bene e può essere difficile da interrogare. Ecco un link a un case study: http://www.simple-talk.com/opinion/opinion-pieces/bad-carma/ –

3

La sesta forma normale è il modo formale per implementarlo. Vai con 3NF per tutte le tabelle e 6NF per una o due tabelle che è necessario aggiungere colonne senza modifiche DDL. Usare con parsimonia.

EAV è il figlio bastardo di 6NF. Ciò che significa è, le persone che lo fanno, e scrivono su di esso, non hanno una comprensione formale di 6NF, così spesso creano mostruosità.

Naturalmente, è necessario mantenere buoni standard: utilizzare i tipi di dati; Integrità referenziale dichiarativa (chiavi esterne); ecc. Non rinunciare a quelli ottenere nulla. Corri via come l'inferno da chiunque ti dica che devi rinunciare.

6NF/EAV è molto veloce, non vi è alcun impedimento all'utilizzo della capacità di elaborazione dei set del server. Di nuovo, scappa via da chiunque ti dica che devi usare l'elaborazione riga per fila o i cursori o che non puoi costruire facilmente le colonne dalle righe. Invia di nuovo se hai problemi specifici.

Ciò richiede di andare oltre la capacità corrente (controlli, DDL) di SQL; per farlo in modo controllato ed evitare di creare mostri non mantenibili, è necessario un piccolo catalogo, per contenere i meta-dati. Se sei intelligente, puoi usarlo per generare l'SQL necessario per l'interrogazione e quindi eliminare un sacco di lavoro manuale.

C'è molta disinformazione in giro, e alcune persone con "rappresentante" sono senza tracce. Per avere successo tecnicamente, abbiamo bisogno di informazioni accurate, non di miti e di spasimanti. Potresti essere interessato a un post recente in cui ho provato a set the recond straight.

0

Per questa tabella vengono utilizzate 3 tabelle in cui è necessario supportare i campi definiti dall'utente. Così, per esempio, se si desidera applicare questo al vostro tavolo SONDAGGIO, è possibile creare:

tabella contiene
SURVEY_ATTRIBUTE 
- SurveyAttributeId 
- SurveyAttributeName 
- SurveyAttributeType 

SURVEY_ATTRIBUTE_CHOICE 
- SurveyAttributeChoiceId 
- SurveyAttributeChoice 
- SurveyAttributeId 

SURVEY_ATTRIBUTE_VALUE 
- SurveyAttributeValueId 
- SurveyId 
- SurveyAttributeValue 

Il SURVEY_ATTRIBUTE un record per attributo personalizzato. La tabella SURVEY_ATTRIBUTE_VALUE memorizza gli attributi effettivamente assegnati ai sondaggi. Quindi se un attributo non si applica a un servey, nulla viene memorizzato. La tabella SURVEY_ATTRIBUTE_CHOICE memorizza tutte le scelte consentite per gli attributi di tipo 'LIST'.

Il campo SurveyAttributeType nella tabella SURVEY_ATTRIBUTE viene utilizzato per descrivere il tipo dell'attributo. Utilizziamo solo un numero limitato di tipi consentiti come CHAR, DATE, NUMBER, LIST. A seconda del valore, la nostra applicazione sa cosa fare con il valore memorizzato nel campo SurveyAttributeValue. Ovviamente potresti formalizzare ulteriormente per consentire una gamma più ampia, specificare il massimo campo di lunghezza, ecc., Tutto dipende dal livello di libertà che desideri offrire al tuo utente finale. Cerchiamo di mantenerlo il più semplice possibile per il nostro pubblico di destinazione non sono gli amministratori di database ma gli utenti finali, di solito non si preoccupano dei fieldlengths e così via.

È inoltre possibile scegliere di saltare la tabella SURVEY_ATTRIBUTE_CHOICE e memorizzare i valori consentiti in una stringa XML nel campo SURVEY_ATTRIBUTE. Ciò dipenderà dal modo in cui implementerai nella tua applicazione.

Problemi correlati