yo tenemos dos tablas:Relaciones uno a muchos en (PostgreSQL) SQL
mensajes:
id | ... other stuff ... | tags
----+---------------------+--------------
1 | ... | <foo><bar>
2 | ... | <foo><baz><blah>
3 | ... | <bar><blah><goo>
y etiquetas:
tag
--------------
<foo>
<bar>
<baz>
<blah>
<goo>
posts.tags y son tags.tag ambos de tipo texto. Lo que quiero es una relación de tags.tag a filas en los puestos de tal manera que la consulta <foo>
me daría filas correspondientes a los puestos 1 y 2, la consulta <blah>
me da 2 y 3, <bar>
me da 1 y 3, etc.
Miré llaves extranjeras, pero no estoy seguro de que sea lo que quiero. (y honestamente, no estoy exactamente seguro de qué es). Por lo que puedo decir, una clave externa debe ser igual a una clave principal/columna única de una tabla. Pero lo que quiero es que todas las filas de tal manera que posts.tags ~ '.*<foo>.*'
, etc., también quiero ser capaz de, por ejemplo, obtener todas las etiquetas que comienzan con b, por ejemplo:
CREATE VIEW startswithB AS
SELECT tag
FROM tags
WHERE tag ~ '<b.*>';
SELECT DISTINCT * FROM posts, startswithB WHERE posts.tags ~ ('.*' || startswithB || '.*');
¿Cómo consigo la relación Busco ¿para? ¿Es posible?
EDIT:
bien, lo que he hecho:
crear post_tags:
SELECT posts.id, tags.tag
INTO post_tags
FROM posts, tags
WHERE posts.tags ~ ('.*' || tags.tag || '.*');
seleccionar todos los mensajes con la etiqueta <foo>
:
SELECT *
FROM posts
WHERE posts.id IN (
SELECT id
FROM post_tags
WHERE tag = '<foo>'
);
Busque el sql ['LIKE'] (http://www.postgresql.org/docs/7.4/static/functions-matching.html). En su caso, no es posible crear una clave externa porque el valor debe coincidir en ambas tablas. –
Este diseño es MUY malo. ¿Estás en un entorno donde puedes cambiarlo? Un diseño apropiado sería: publicaciones (identificación, texto, productos); etiquetas (identificación, etiqueta); y posts_tags (post_id, tag_id) que hace referencia tanto a la tabla de mensajes como a la tabla de etiquetas (relación many2many: una etiqueta tiene muchas publicaciones y una publicación tiene muchas etiquetas) – Arthur