rdbms查询中语言标记(小标记集)的有效方法

时间:2012-12-31 23:25:51

标签: postgresql activerecord database-schema rdbms

我的应用程序使用RDBMS(postgres w / activerecord)来存储和获取文本对象。每个文本对象可以包含任意数量的语言。到目前为止,我一直在考虑将这些语言关联作为我头脑中的标签,就像博客帖子可以包含任意数量的任意标签一样。但是,这些语言标签不是任意的,而是限制在一个约30的小集合。在我的应用程序中,用户可以请求一些文本对象并提供一组语言(比如英语,德语和法语),应用程序应该继续并抓取一些与这些语言相关的文本对象。

将语言与这些文本对象相关联以使查询变得容易,最有效的方法/架构是什么?

1 个答案:

答案 0 :(得分: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