Eu tenho uma tabela em que as linhas podem ser relacionadas entre si e, logicamente, o relacionamento segue nos dois sentidos (basicamente, é sem sentido) entre as duas linhas. (E se você está se perguntando, sim, essa realmente deve ser uma tabela. São duas coisas exatamente da mesma entidade / tipo lógico.) Posso pensar em algumas maneiras de representar isso:
- Armazene o relacionamento e seu reverso
- Armazene o relacionamento de uma maneira, impeça o banco de dados de armazená-lo de outra maneira e tenha dois índices com ordens opostas para os FKs (um índice sendo o índice PK)
- Armazene o relacionamento de uma maneira com dois índices e permita que o segundo seja inserido de qualquer maneira (soa meio nojento, mas ei, completo)
- Crie algum tipo de tabela de agrupamento e tenha um FK na tabela original. (Levanta muitas perguntas. A tabela de agrupamento só teria um número; por que até a tabela? Tornar FK NULLable ou ter grupos com uma única linha associada?)
Quais são alguns dos principais prós e contras dessas formas e, é claro, existe alguma maneira em que eu não tenha pensado?
Aqui está um SQLFiddle para jogar: http://sqlfiddle.com/#!12/7ee1a/1/0 . (Por acaso é o PostgreSQL, já que é isso que estou usando, mas não acho que essa pergunta seja muito específica do PostgreSQL.) Atualmente, ele armazena o relacionamento e seu inverso apenas como exemplo.