Re: Advice for using integer arrays?

Michael Heaney <mheaney@jcvi.org>

From: Michael Heaney <mheaney@jcvi.org>
To: "pgsql-general@postgresql.org" <pgsql-general@postgresql.org>
Date: 2015-01-06T21:18:29Z
Lists: pgsql-general
On 1/6/2015 2:19 PM, Jeff Janes wrote:
> On Tue, Jan 6, 2015 at 9:09 AM, Michael Heaney <mheaney@jcvi.org 
> <mailto:mheaney@jcvi.org>> wrote:
>
>     I'm fairly new to Postgres, and have a design issue for which an
>     array of integers might be a good solution.  But I'd like to hear
>     from the experts before proceeding down this path.
>
>     Essentially, I'm trying to model the relationship between a group
>     of biological samples and their genes. Each sample (there are ~10K
>     of them now, with more coming) will have about 30,000 genes.
>     Conversely, a particular gene may be present in almost all samples.
>
>     So I've created the following table to handle the many-to-many
>     relationship:
>
>      create table sample_gene (id serial, sample_id int, gene_id int);
>
>
> What is the value of having this table at all?  It doesn't seem to 
> contain anything informative, like an allele identifier, a resequence, 
> or a copy number variation.  If you are just trying to record the fact 
> that a gene was present in that sample, perhaps it would be better to 
> instead record the genes have been deleted, rather than the ones that 
> have not been deleted?  That would probably be a much smaller list.
>

I suppose there could be a gene table which would contain data about 
each gene_id.
But I'm an IT guy, not a biologist, and my sample_gene table doesn't 
actually
exist.  I'm more concerned with how to deal with many-to-many relationships
when each parent could have tens of thousands of children. Collapsing all
the children into an array for each parent looked intriguing - but maybe 
it's
not a good idea.  I just don't know, so I thought I'd ask you guys.



>      create table sample_gene_array (id serial, sample_id int, gene_id
>     int [] );
>
>     So now the table data looks like this:
>
>     sample_id    |    gene_id []
>     ---------------------------------------
>     1                 |      [1:30475]
>     2                 |      [1:29973]
>     etc.
>
>
> I'm not familiar with the square bracket and colon as a syntax for 
> expressing int arrays.  Are you taking liberties with the psql output, 
> or using a different client program?  Does that represent the range 
> from 1 to 30475, or the two values 1 and 30475?

Yes, it's shorthand for the full range of values from 1 to 30475. Wasn't 
sure how
to represent it, and almost went with (1,2,3...30475).  Apologies...


Michael Heaney
JCVI