PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come memorizzare una matrice o più valori in una colonna

Hai un paio di domande qui, quindi le affronterò separatamente:

Ho bisogno di memorizzare un numero di elementi selezionati in un campo in un database

La mia regola generale è:non farlo. Questo è qualcosa che tutti tranne richiede una seconda tabella (o terza) con una chiave esterna. Certo, ora può sembrare più semplice, ma cosa succede se si presenta il caso d'uso in cui è necessario eseguire effettivamente query per quegli elementi individualmente? Significa anche che hai più opzioni per l'istanza pigra e hai un'esperienza più coerente su più framework/linguaggi. Inoltre, è meno probabile che tu abbia problemi di timeout della connessione (30.000 caratteri sono molti).

Hai detto che stavi pensando di usare ENUM. Questi valori sono fissi? Li conosci in anticipo? Se sì questa sarebbe la mia struttura:

Tavolo base (quello che hai ora):

| id primary_key sequence
| -- other columns here.

Tabella articoli:

| id primary_key sequence
| descript VARCHAR(30) UNIQUE

Tabella della mappa:

| base_id  bigint
| items_id bigint

La tabella della mappa dovrebbe avere chiavi esterne in modo che base_id venga mappata alla tabella di base e items_id sarebbe mappata alla tabella degli elementi.

E se desideri un modo semplice per recuperarlo da un DB, crea una vista che esegua i join. Puoi persino creare regole di inserimento e aggiornamento in modo da avere praticamente a che fare con una sola tabella.

Quale formato devo usare per archiviare i dati?

Se devi fare qualcosa del genere, perché non usare semplicemente una stringa delineata da caratteri? Richiederà meno potenza di elaborazione rispetto a CSV, XML o JSON e sarà più breve.

Che tipo di colonna devo usare per archiviare i dati?

Personalmente, userei TEXT . Non sembra che guadagneresti molto trasformandolo in un BLOB e TEXT , secondo la mia esperienza, è più facile da leggere se stai usando una qualche forma di IDE.