Tôi có hai bảng:mối quan hệ One-to-Nhiều trong (Postgre) SQL
bài viết:
id | ... other stuff ... | tags
----+---------------------+--------------
1 | ... | <foo><bar>
2 | ... | <foo><baz><blah>
3 | ... | <bar><blah><goo>
và các thẻ:
tag
--------------
<foo>
<bar>
<baz>
<blah>
<goo>
posts.tags và tags.tag là cả hai loại văn bản. Những gì tôi muốn là một mối quan hệ từ tags.tag để hàng trong bài viết như vậy mà truy vấn <foo>
sẽ cho tôi hàng tương ứng với bài 1 và 2, truy vấn <blah>
mang lại cho tôi 2 và 3, <bar>
mang lại cho tôi 1 và 3, vv
Tôi đã xem xét các khóa ngoại, nhưng tôi không chắc đó là điều tôi muốn. (và thành thật mà nói, tôi không chắc chắn nó làm gì). Từ những gì tôi có thể nói một khóa ngoại phải bằng một khóa chính/cột duy nhất của một bảng. Nhưng những gì tôi muốn là tất cả các hàng mà posts.tags ~ '.*<foo>.*'
, vv Tôi cũng muốn để có thể, chẳng hạn, có được tất cả các thẻ bắt đầu bằng b, ví dụ:
CREATE VIEW startswithB AS
SELECT tag
FROM tags
WHERE tag ~ '<b.*>';
SELECT DISTINCT * FROM posts, startswithB WHERE posts.tags ~ ('.*' || startswithB || '.*');
Làm thế nào để có được mối quan hệ tôi đang tìm cho? Có thể không?
EDIT: post_tags
tạo::
Được rồi, những gì tôi đã làm
SELECT posts.id, tags.tag
INTO post_tags
FROM posts, tags
WHERE posts.tags ~ ('.*' || tags.tag || '.*');
chọn tất cả các bài viết với từ khóa <foo>
:
SELECT *
FROM posts
WHERE posts.id IN (
SELECT id
FROM post_tags
WHERE tag = '<foo>'
);
Hãy tìm sql ['LIKE'] (http://www.postgresql.org/docs/7.4/static/functions-matching.html). Trong trường hợp của bạn, bạn không thể tạo khóa ngoại, vì giá trị phải khớp với cả hai bảng. –
Thiết kế này rất RẤT. Bạn đang ở trong một môi trường mà bạn có thể thay đổi nó? Một thiết kế phù hợp sẽ là: các bài viết (id, văn bản, các chất liệu); thẻ (id, thẻ); và posts_tags (post_id, tag_id) tham chiếu cả bảng bài đăng và bảng thẻ (mối quan hệ many2many: thẻ có nhiều bài đăng và bài đăng có nhiều thẻ) – Arthur