2013-02-06 9 views
5

Nella mia app Rails, voglio memorizzare i limiti geografici dei campi delle colonne dei luoghi in un database. Ad esempio, il confine di New York è rappresentato come un poligono: una matrice di matrici.Quale tipo di dati posso usare per campi di testo molto grandi che sono indipendenti dal database?

Ho dichiarato il mio modello per serializzare i poligoni, ma non sono sicuro che dovrei memorizzarli in questo modo. Le dimensioni di questi poligoni serializzati superano facilmente i 100.000 caratteri e MySQL può memorizzare solo circa 65000 characters in un campo TEXT standard.

Ora so che MySQL ha anche un campo LONGTEXT. Ma voglio davvero che la mia app sia indipendente dal database. Come gestisce Rails da solo? Passerà automaticamente ai campi LONGTEXT? E quando inizi a utilizzare PostgreSQL?

+0

Che dire di BLOB? – m0skit0

+0

Penso che abbia le stesse limitazioni di TEXT e che Rails sia serializzato in una stringa (con YAML). – Maarten

risposta

3

A questo punto suggerisco di chiedersi: questi dati devono essere memorizzati o devono essere archiviati in un database in questo formato?

propongo 2 possibili soluzioni:

  1. Conservare i poligoni nel filesystem, e di riferimento dal database. Tali elementi di dati di grandi dimensioni sono di scarsa utilità in un database: è praticamente inutile interrogarli come testo. Il filesystem è buono per la memorizzazione dei file - usalo.

  2. Se avete bisogno di questi poligoni nel database, memorizzarli come dati normalizzati. Avere una tabella denominata poligono e un altro punto chiamato, deserializzare i poligoni e memorizzarla in un modo che riflette il modo in cui i database sono destinati a essere utilizzati.

Spero che questo sia di aiuto.

+0

# 2 è un'idea interessante, anche se a meno che i poligoni non vengano modificati di frequente, è un approccio più complicato. – benzado

2

Postgresql ha una libreria denominata PostGIS che la mia azienda utilizza per gestire posizioni geometriche e calcoli che possono essere molto utili in questa situazione. Credo che postgresql abbia anche due tipi di dati che consentono array e hash. Gli array sono dichiarati, ad esempio, come text[] dove il testo potrebbe essere sostituito con un altro tipo di dati. Gli hash possono essere definiti usando il modulo hstore.

+0

Da OP: * "Desidero davvero che la mia app sia indipendente dal database" * – m0skit0

1

Anche se si può memorizzare questo tipo di cose nel database, si dovrebbe considerare di memorizzarlo esternamente, e basta inserire un URL o qualche altro identificatore nel database.

Se si trova nel database, si può finire per caricare 64 KB di dati in memoria quando non si intende usarlo, solo perché si accede a qualcosa in quella tabella. Ed è più facile scalare una collezione di file di sola lettura (usando qualcosa come Amazon S3) rispetto a una tabella di database.

2

This question risponde parte della mia domanda: Rails imposta un limite di byte predefinito di 65535 e può essere modificato manualmente.

Tutto sommato, se si incontreranno problemi dopo dipende dal database che si sta utilizzando. Per MySQL, Rails passerà automaticamente al campo * TEXT appropriato. MySQL può memorizzare to 1GB di testo.

Ma come dire benzado e thomasfedb, è probabilmente meglio memorizzare le informazioni in un file in modo che il database non assegni molta memoria che potrebbe non essere nemmeno utilizzata.

Problemi correlati