Thread: table has many to many relationship with itself - how to implement?

table has many to many relationship with itself - how to implement?

From
"Daniel McBrearty"
Date:
Hi all,

I have a table "phrases" that looks like this :

create table phrases(
 id serial ,
 language integer references langauges(id),
 content text
);


Simply a word or phrase in some language.

Now I want to express the concept of a "translation". A translation is
a number of phrases from different languages that are a translation of
each other. There is nothing else to say about a translation - though
it does need to be referencable by other tables, so it needs an ID.

One way to do this is with these two tables:

create table translations (
 id serial primary key
);

create table translations_to_phrases (
 translation_id integer references translations(id),
 phrase_id integer references phrases(id),
 primary key (translation_id, phrase_id)
);

Now this actually works as a data structure; the translations table is
a bit odd, having only an id, but that is all we really need.

Can I do this though? can I create a row in translations?

insert into table translations ... insert what?

The other way to do this that I see is to lose the link table
translations_to_phrases, and then make translations

create table translations (
 id serial primary key,
 phrases integer[]
);


but it seems that I can no longer make postgre aware that the integers
in translations(phrases) are references.

What is the best solution?

Thanks

Daniel

--
Daniel McBrearty
email : danielmcbrearty at gmail.com
www.engoi.com : the multi - language vocab trainer
BTW : 0873928131

Re: table has many to many relationship with itself - how to implement?

From
"Jim C. Nasby"
Date:
On Wed, Jun 14, 2006 at 10:53:36AM +0200, Daniel McBrearty wrote:
> Hi all,
>
> I have a table "phrases" that looks like this :
>
> create table phrases(
> id serial ,
> language integer references langauges(id),
> content text
> );

Might want to avoid bareword 'id' as a field name... it's a great way to
lead to confusion.

> insert into table translations ... insert what?

INSERT INTO translations VALUES(default) should work. Worst case, you
could always just select from the appropriate sequence.

> The other way to do this that I see is to lose the link table
> translations_to_phrases, and then make translations
>
> create table translations (
> id serial primary key,
> phrases integer[]
> );
>
>
> but it seems that I can no longer make postgre aware that the integers
> in translations(phrases) are references.

BTW, it's "PostgreSQL" or "Postgres" if you must.

> What is the best solution?

I'd just have a sequence for translation_id and grab from it manually
every time you create a translation, then just use that value when you
insert into translation_phrase.
--
Jim C. Nasby, Sr. Engineering Consultant      jnasby@pervasive.com
Pervasive Software      http://pervasive.com    work: 512-231-6117
vcard: http://jim.nasby.net/pervasive.vcf       cell: 512-569-9461