我的应用程序使用RDBMS(postgres w / activerecord)来存储和获取文本对象。每个文本对象可以包含任意数量的语言。到目前为止,我一直在考虑将这些语言关联作为我头脑中的标签,就像博客帖子可以包含任意数量的任意标签一样。但是,这些语言标签不是任意的,而是限制在一个约30的小集合。在我的应用程序中,用户可以请求一些文本对象并提供一组语言(比如英语,德语和法语),应用程序应该继续并抓取一些与这些语言相关的文本对象。
将语言与这些文本对象相关联以使查询变得容易,最有效的方法/架构是什么?
答案 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