Come memorizzare array o più valori in una colonna

Running Postgres 7.4 (Sì, siamo nel bel mezzo dell’aggiornamento)

Devo memorizzare da 1 a 100 elementi selezionati in un campo in un database. Il 98% delle volte sarà solo 1 elemento inserito, e il 2% delle volte (se questo) ci saranno più oggetti.

Gli oggetti non sono altro che una descrizione testuale (a partire da ora) non più lunga di 30 caratteri. Sono valori statici che l’utente seleziona.

Volevo sapere il tipo di dati di colonna ottimale utilizzato per memorizzare i dati desiderati. Stavo pensando BLOB ma non sapevo se questo è eccessivo. Forse JSON?

Inoltre, ho pensato a ENUM, ma al momento non posso farlo perché abbiamo Postgres 7.4

Volevo anche essere in grado di identificare facilmente gli articoli inseriti, quindi nessun mapping o tabella di riferimento.

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 è: no. Questo è qualcosa che richiede solo una seconda tabella (o una terza) con una chiave esterna. Certo, può sembrare più facile ora, ma cosa succede se arriva il caso d’uso in cui è necessario interrogare effettivamente per quegli articoli individualmente? Significa anche che hai più opzioni per l’istanza lazy e hai un’esperienza più coerente su più framework / linguaggi. Inoltre, è meno probabile che si verifichino problemi di timeout della connessione (30.000 caratteri sono molti).

Hai detto che stavi pensando di usare ENUM. Questi valori sono corretti? Li conosci prima del tempo? Se è così, 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 avrebbe chiavi esterne in modo che base_id faccia riferimento alla tabella Base e items_id si associ alla tabella degli articoli.

E se desideri un modo semplice per recuperare questo da un DB, quindi creare una vista che fa il join. Puoi persino creare regole di inserimento e aggiornamento in modo tale da occuparti praticamente solo di una tabella.

Quale formato dovrei usare per memorizzare i dati?

Se devi fare qualcosa di simile, perché non usare solo una stringa delimitata dal carattere? Ci vorrà meno potenza di elaborazione di un CSV, XML o JSON, e sarà più breve.

Quale tipo di colonna dovrei usare per memorizzare i dati?

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

Bene, c’è un tipo di array nelle recenti versioni di Postgres (non al 100% su PG 7.4). Puoi persino indicizzarli, usando un indice GIN o GIST. Le syntax sono:

 create table foo ( bar int[] default '{}' ); select * from foo where bar && array[1] -- equivalent to bar && '{1}'::int[] create index on foo using gin (bar); -- allows to use an index in the above query 

Ma come suggerisce la risposta precedente, sarà meglio normalizzare correttamente.