2011-01-29 11 views
5

Tengo un escenario donde tengo una gran cantidad de blogs. Todos estos blogs tienen múltiples publicaciones. Cada entrada de blog puede vincular a una publicación en otro blog, pero luego deben nunca vincular desde ese blog al blog de enlace.Consulta SQL para manejar relaciones complejas

Para aclarar:

  • enlaces del sitio A al sitio B (y puede enlazar a otros sitios)
  • sitio B a continuación no puede enlace al sitio (pero puede enlazar a otros sitios)

Cada vez que se realiza una publicación, guardo el ID de la publicación y la ID del sitio web al que enlaza. Es importante recordar que, una vez que una publicación única se vincula a cualquier publicación en otro sitio web, ese otro sitio web no puede enlazar desde en cualquier lugar, no solo la publicación a la que está vinculado.

El sitio A puede enlazar al sitio B tantas veces como quiera, y cada publicación puede vincular a más de una publicación. Un escenario de ejemplo podría ser:

  • enlaces sitio A al sitio B
  • sitio C enlaces a sitio B
  • sitio Enlaces D a sitio

En los datos anteriores:

  • El sitio A podría vincular al sitio C (o al sitio B nuevamente)
  • El sitio B podría enlazar al sitio D
  • Sitio C podría enlazar a sitio o sitio D (o sitio B de nuevo)
  • sitio D podría enlace al sitio B o Sitio C (o del sitio de nuevo)

Aquí hay un enlace a algunos datos de prueba y un volcado de las 2 tablas necesarias: http://pastie.org/1506715

Creo que necesito una unión cruzada para obtener todas las combinaciones de enlaces posibles, pero luego factor en las relaciones existentes para evitar que los sitios se vinculen en la dirección opuesta. La consulta que tengo hasta ahora es:

SELECT 
t1.* , t2.* FROM test_posts t1, test_posts as t2 
WHERE 
t1.post_id != t2.post_id 
ORDER BY 
t1.post_id, t2.post_id; 

Esto me da todas las relaciones posibles entre las publicaciones. Lo que estoy luchando es cómo excluir las relaciones que contradicen las reglas anteriores. Las relaciones anteriores se registran en la tabla test_smartlinks_to_websites, con post_id que pertenece al sitio web "originating" y al website_id que pertenecen al sitio "destination" (recordando que la relación es efectivamente unidireccional entre sitios web, no publicaciones).

He intentado usar una subconsulta NOT EXISTS, pero no estoy seguro de la cláusula exacta (o si ese es el enfoque correcto).

+0

Así que este es un nivel completamente jerárquica de los puestos ??? es decir: A enlaces a B, B pueden vincular a C, C a D, por lo tanto, aunque C y D no están vinculados explícitamente a A, ¿puede A tener un enlace directo a C y/o D a pesar de estar bajo B? Además, ¿en ESTA muestra B tampoco permitiría un enlace a D o puede porque no está DIRECTAMENTE vinculado? – DRapp

+0

No es una jerarquía, es una especie de red de enlaces, pero ninguno de los sitios debería volver atrás, todo debe ser de una sola dirección. (Estoy trabajando con BrynJ en esto) – Mike

+0

Hay mucho sobre blogs, publicaciones en la pregunta ... pero hay una desconexión entre eso y tus tablas ... qué tabla almacena qué ... dónde están los datos del blog ... ¿Dónde está la información de la publicación ...? ¿Dónde están los enlaces de los que has hablado tanto sobre los almacenados en la tabla ...? – Mulki

Respuesta

3

Corrígeme si me equivoco. Parece que su tarea es determinar los ciclos en el gráfico dirigido. No es tan complejo como parece. Por favor, consulte esta publicación de blog para saber cómo se hace en SQL: http://devio.wordpress.com/2009/09/13/finding-cycles-in-directed-graphs-using-tsql/. También vea este enlace para la primera búsqueda de amplitud en SQL: http://willets.org/sqlgraphs.html.

EDITADO: se han agregado imágenes para mayor claridad y comprensión de gráficos cíclicos y acíclicos dirigidos.

Por ejemplo, aquí hay algo que se parece a su situación. No es un solo gráfico sino un conjunto de gráficos (o bosque si fueran árboles). Tenga en cuenta que no hay una raíz común. Solo son nodos conectados de alguna manera. Hay un ciclo en el subgrafo más grande donde los nodos se referencian entre sí. Si para eliminar el enlace hacia arriba, el subgrafo se vuelve acíclico.

enter image description here

+0

Gracias por los enlaces. He leído el contenido y, si soy sincero, no entiendo algunas complejidades; sin embargo, creo que los problemas allí descritos son un poco más complejos. Simplemente necesito establecer a partir de un conjunto de relaciones registradas, que si el sitio A se vincula con B, B no puede enlazar con A ... y devolver todas las posibles permutaciones válidas de la vinculación del sitio. – BrynJ

+0

Esa fue mi primera impresión ... pero los ejemplos en la publicación muestran lo contrario ... aviso "El sitio B podría enlazar al sitio D" en el ejemplo ... ya que d está vinculado a A y A a B que lo hace circular ... pero permitido ... Parece que solo está buscando un trackback ... cualquier cosa con una referencia retrospectiva – Mulki

+0

@BrynJ: uhm ... eso es lo que es el gráfico dirigido. A, C-> B-> D y un ciclo A, C-> B-> D-> C, F. Intenta dibujar eso y será más claro. – Schultz9999

Cuestiones relacionadas