2010-10-11 19 views
8

Ho cercato di rispondere a un complesso problema di struttura dati Mysql per campi personalizzati per un'applicazione online. Sono abbastanza nuovo per Mysql quindi qualsiasi input è apprezzato.Matrice, EAV, LOB serializzato per campi personalizzati?

Il database corrente è un database relazionale e ogni utente del servizio condividerà lo stesso database e le stesse tabelle.

Ecco un esempio di ciò che sto cercando di fare.

Diciamo che sto provando a creare un elenco. Questo elenco può contenere fino a 30 campi personalizzati. L'utente può scegliere tra 12 elementi unici e ogni elemento può avere fino a 15 attributi definiti dall'utente.

Ogni elenco può essere univoco all'interno di un account e tra account. Gli account possono avere numerosi elenchi e ogni lista può avere diverse quantità di elementi e diversi attributi per elemento.

Un elemento può essere molte cose, ad esempio: scelta multipla, pulsante, campo di telefono, indirizzo, testo singola linea, testo su più righe, ecc

Un esempio di attributi per una scelta multipla (casella di controllo) elemento potrebbe essere: rosso, verde, blu, arancione, bianco, nero

Un esempio di un elemento di testo a riga singola potrebbe essere: campo di inserimento Nome.

Ogni elemento deve inoltre avere un campo titolo e un campo tag definiti dall'utente che possono essere referenziati e utilizzati in altre funzioni dell'app.

La segmentazione è molto importante. Un utente deve essere in grado di segmentare un elenco in base a qualsiasi elemento. Ad esempio, un utente potrebbe voler segmentare l'elenco "ABC" in base a tutti i record in cui "rosso" è presente nell'elemento a scelta multipla n. 1 (potrebbero avere più di 1 elemento a scelta multipla per un elenco).

In questo esempio, suppongo che gli array, EAV, LOB serializzato funzionino correttamente. Tuttavia, non sono sicuro di quale sarebbe la migliore struttura per i miei bisogni alla mia portata.

In realtà, molto probabilmente ci saranno fino a 50.000 record per elenco e vi è una possibilità reale di oltre 20.000 account, ciascuno con numerosi elenchi. Pertanto, sto cercando la struttura più efficiente e flessibile.

Per rendere le cose ancora più complesse, ho anche bisogno di garantire un modo efficace per aggiungere/eliminare elementi a un particolare elenco in qualsiasi momento. Ad esempio, se un utente crea un elenco con il numero massimo consentito di campi personalizzati (30) e poi tre mesi dopo decide di voler eliminare un campo, ho bisogno di un modo per trovare quell'elenco e tutti i valori associati per quel campo personalizzato e quindi elimina tutti i valori, il tipo di elemento e i suoi attributi. L'utente sarebbe quindi autorizzato ad aggiungere un nuovo elemento a questo elenco.

Ho esaminato molti dei messaggi EAV su questo sito, così come questo http://www.martinfowler.com/eaaCatalog/serializedLOB.html Non sembra che EAV sarebbe molto efficiente per le mie esigenze a causa degli aspetti negativi del recupero dei dati.

Mi chiedevo anche quanto bene un array multidimensionale avrebbe funzionato a questa scala? Credo che wordpress usi questo per i loro campi personalizzati.

Qualsiasi input sarebbe molto apprezzato per quanto riguarda la migliore strutturazione del database per questa situazione. Grazie!

+0

Anche io sto affrontando la stessa sfida: quale soluzione sei andato? Sarei molto interessato alle tue esperienze – philwilks

risposta

0

È possibile utilizzare json enconding e decoding (presumo che si stia utilizzando PHP) per memorizzare le informazioni di input in una tabella con una colonna per memorizzare l'utente e altro per memorizzare questi dati come testo. Le risposte devono essere archiviate in un'altra tabella (con un FK per usare CASCADE ON DELETE).

Se è possibile specificare la dimensione massima della specifica di input, utilizzare un campo varchar.

Questo non può essere il miglior aprouch (bisogno di alcuni test di profilazione per assicurarsi che sia abbastanza robusto), ma può essere usato sicuro.

1

Si può leggere su come FriendFeed implementa campi personalizzati: http://bret.appspot.com/entry/how-friendfeed-uses-mysql

usano una combinazione di serializzato LOB, con tavoli extra contenenti indici invertiti. Non hai bisogno di una tabella aggiuntiva per ogni attributo possibile nel tuo LOB, solo quelli che vuoi cercare con l'aiuto di un indice.

+0

http://bret.appspot.com/entry/how-friendfeed-uses-mysql non viene trovato –

+0

@wangyiran, non sorprende, che il blog è di oltre 6 anni. Descrivo la stessa tecnica di indicizzazione invertita nella mia presentazione qui: http://www.slideshare.net/billkarwin/extensible-data-modeling. –

Problemi correlati