Advice on structure /sequence / trigger - Mailing list pgsql-admin

From David Pratt
Subject Advice on structure /sequence / trigger
Date
Msg-id 86D149DB-DDD9-11D9-AB38-000A27B3B070@eastlink.ca
Whole thread Raw
In response to Re: Blob error after backup and restore [database > 5.5 Gb.]  ("Amrit Angsusingh" <amrit@chaiyo.com>)
List pgsql-admin
Hi I have a number of tables. I am interested in having some
internationalization capability so that the application and it's data
can be in more than one language.  i18 will take care of the interface
but not the data. To internationalize the date, I am wanting to put the
internationalized text strings in a multi_language table like this:

CREATE TABLE multi_language (
    id                                   SERIAL,
          ml_id                            INTEGER NOT NULL,
    language_id               INTEGER NOT NULL,
    language_text             TEXT NOT NULL
);

Other tables would have be joined by ml_id (the multi language id).
For example:

CREATE TABLE example_table (
    id                                    SERIAL,
    name_ml_id                 INTEGER NOT NULL,

So in example_table, name_ml_id would join ml_id so you have the same
ml_id in multi_language table for more than one language. So there
would be two records in multi_language for a record in example_table if
you had an english translation and  french translation.

I want to add records to multi_language sequentially.  So lets say I
add a new example in example_table, I want to see what the last value
that was added to multi_language was so that if would use the next in
the sequence.  As you can see by the structure the id field is serial
and does this but I am speaking of the ml_id field specifically.  Let's
say I have one example record in example_table, multi_language would
look like this

1, 1, 1, the brown cow   # english translation of name - language 1 (en)
2, 1, 2,  la vache brun    # french translation of name - language 2
(fr)

ml_id for both record is 1.

So when I create a second record example_table, I want to have this:

1, 1, 1, the brown cow   # english translation of name (of example
record - language 1 (en)
2, 1, 2, la vache brun    # french translation of name (of example
record- language 2 (fr)
3, 2, 1, the blue turkey  #english translation of name (second record -
language 1(en)
4, 2, 2, la dandon bleu  #french translation of name (second record -
language 2 (fr)

Ok now the questions. How best to do this? Would I create a separate
sequence for multi_language ml_id and do a select on it to get the next
value before inserting each multi_language record.  Should this be done
using a trigger - if so how? Should this be done in my application code
and not sql or would that be dangerous.  For example, the
multi_language table would be used a lot. What if a couple of people
were creating new records at the same time. If I were using python and
doing this in my application code, I am wondering if there could be
problems. With a trigger it would be transactional, correct? Can you
have a trigger work from incrementing a sequence instead of updating a
table?

I just want to get this right because it will be an important part of
what I am preparing. Sorry for the really long message but I don't know
if  it would make any sense if I did not fully explain what i am
wanting to do. Oh, and I am not french so excuse my sample
translations...

Regards,
David

pgsql-admin by date:

Previous
From: "Amrit Angsusingh"
Date:
Subject: Re: Blob error after backup and restore [database > 5.5 Gb.]
Next
From: Alvaro Herrera
Date:
Subject: Re: How to recover when can't start database