Search Postgresql Archives

Re: Versioned, chunked documents

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 2012-04-02 at 00:38 +0200, Ivan Voras wrote:
> Hi,
> 
> I have documents which are divided into chunks, so that the (ordered)
> concatenation of chunks make the whole document. Each of the chunks may
> be edited separately and past versions of the chunks need to be kept.
> 
> The structure looks fairly simple:
> 
> The first goal is to retrieve the latest version of the whole document,
> made from the latest versions of all chunks, but later the goal will
> also be to fetch the whole version at some point in time (i.e. with
> chunks created before a point in time).
> 
> I did the first goal by creating two helper views:
> 
> CREATE VIEW documents_chunks_last_version_chunk_ids AS
>     SELECT documents_id, max(id), seq FROM documents_chunks GROUP BY
> documents_id, seq;
> 
> CREATE VIEW documents_chunks_last_version_content AS
>     SELECT documents_chunks.documents_id, content
>         FROM documents_chunks
>         JOIN documents_chunks_last_version_chunk_ids ON
> documents_chunks.id=documents_chunks_last_version_chunk_ids.max
>         ORDER BY documents_chunks_last_version_chunk_ids.seq;
> 
> There are indexes on the document_chunks fields seq and documents_id.
> 
> Everything looked fine until I examined the output of EXPLAIN ANALYZE
> and saw this:
> 
I'm not surprised. First guess: I'd use 
	id (FK of documents), seq, ctime 

as the prime key of document_chunk, which would work for your initial
requirement but is far too simplistic to deal with the general
requirement of retrieving a specific document version. You'd probably
need something like:

CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    title TEXT NOT NULL,
 ...
 );

Create table version ( 
   version_no serial primary key,
   author var char 40,
   ctime timestamp );

create table document_version (
   id serial references document(id),
   version_number serial references version(version_no),
 primary_key (id, version_no),
);
 
CREATE TABLE documents_chunks (
    id SERIAL references document_version(id),
    version_number serial references document_version(version_number),
    seq serial,
    content TEXT,
    primary_key(id, version_number, seq)
};

Disclaimer: this is not syntax checked or tested. It may/or may not
match your requirements, but since I haven't seen your ERD or the 3NF
you derived from it I can't offer any more applicable advice.
 

Martin



-- 
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux