2

我的应用程序使用 RDBMS(带有 activerecord 的 postgres)来存储和获取文本对象。每个文本对象可以有任意数量的与之关联的语言。到目前为止,我一直将这些语言关联视为我脑海中的标签,就像博客文章可以有任意数量的任意标签一样。然而,这些语言标签不是任意的,而是限制在大约 30 个的一小部分。在我的应用程序中,用户可以请求一些文本对象并提供一组语言(比如英语、德语和法语),并且应用程序应该继续并获取与任何这些语言相关联的一些文本对象。

将语言与这些文本对象相关联以简化查询的最有效方法/模式是什么?

4

1 回答 1

1

为了便于查询,您可以创建一个视图来避免不断加入。

create table object (
    id serial unique,
    object text primary key
);

create table tag (
    id serial unique,
    tag text primary key
);

create table object_tag (
    object_id integer references object(id),
    tag_id integer references tag(id)
);

insert into tag (tag) values ('English'), ('French'), ('German');
insert into object (object) values ('o1'), ('o2');
insert into object_tag (object_id, tag_id) values (1, 1), (1, 2), (2, 3);

create view v_object_tag as
select o.id object_id, o.object, t.id tag_id, t.tag
from
    object o
    inner join
    object_tag ot on o.id = ot.object_id
    inner join
    tag t on t.id = ot.tag_id
;

现在查询好像它是一个表:

select *
from v_object_tag
where tag in ('English', 'German')
;
 object_id | object | tag_id |   tag   
-----------+--------+--------+---------
         1 | o1     |      1 | English
         2 | o2     |      3 | German
于 2013-01-01T10:36:44.457 回答