MySQL armazenando arestas de gráfico não direcionadas com eficiência
Desejo armazenar arestas de gráfico não direcionadas (por exemplo, para amigos). Para armazenar e recuperar todos os amigos do nóa
, pode-se usar:
Crie duas linhas por borda, consulte uma coluna por nó:
+--------------------------+
| id | from_node | to_node |
+--------------------------+
| 1 | a | b |
| 2 | b | a |
+--------------------------+
SELECT * FROM `x` WHERE from_node = a
Crie uma linha por borda, useOR
:
+--------------------------+
| id | node_a | node_b |
+--------------------------+
| 1 | a | b |
+--------------------------+
SELECT * FROM `y` WHERE node_a = a OR node_b = a
O que contribui para pesquisas mais eficientes?
Tabelax
com2n
linhas, índices emfrom_node
eto_node
, pesquisa em uma colunaTabelay
comn
linhas, índices emnode_a
enode_b
, procure nas duas colunas usandoOR