У меня есть две таблицы:
posts:
id | ... other stuff ... | tags
----+---------------------+--------------
1 | ... | <foo><bar>
2 | ... | <foo><baz><blah>
3 | ... | <bar><blah><goo>
и теги:
tag
--------------
<foo>
<bar>
<baz>
<blah>
<goo>
posts.tags и tags.tag оба имеют тип text.То, что я хочу, это отношение от tags.tag к строкам в сообщениях, так что запрос <foo>
даст мне строки, соответствующие сообщениям 1 и 2, запрос <blah>
даст мне 2 и 3, <bar>
даст мне 1 и 3,и т.д.
Я посмотрел на внешние ключи, но не уверен, что это то, что я хочу.(и, честно говоря, я не совсем уверен, что он делает).Из того, что я могу сказать, внешний ключ должен быть равен первичному ключу / уникальному столбцу таблицы.Но я хочу, чтобы все строки были такими, чтобы posts.tags ~ '.*<foo>.*'
и т. Д. Я также хочу иметь возможность, скажем, получить все теги, которые начинаются с b, например:
CREATE VIEW startswithB AS
SELECT tag
FROM tags
WHERE tag ~ '<b.*>';
SELECT DISTINCT * FROM posts, startswithB WHERE posts.tags ~ ('.*' || startswithB || '.*');
Как получить отношениеЯ ищу?Возможно ли это?
РЕДАКТИРОВАТЬ:
Хорошо, что я сделал:
создать post_tags:
SELECT posts.id, tags.tag
INTO post_tags
FROM posts, tags
WHERE posts.tags ~ ('.*' || tags.tag || '.*');
выбрать все сообщения с тегом <foo>
:
SELECT *
FROM posts
WHERE posts.id IN (
SELECT id
FROM post_tags
WHERE tag = '<foo>'
);