J'ai une table où les lignes peuvent être liées les unes aux autres, et logiquement, la relation va dans les deux sens (essentiellement, est sans direction) entre les deux lignes. (Et si vous vous demandez, oui, cela devrait vraiment être une seule table. Ce sont deux choses exactement de la même entité / type logique.) Je peux penser à deux façons de représenter cela:
- Conserver la relation et son inverse
- Stockez la relation dans un sens, empêchez la base de données de la stocker dans l'autre sens et ayez deux index avec des ordres opposés pour les FK (un index étant l'index PK)
- Stockez la relation dans un sens avec deux index et laissez le deuxième être inséré de toute façon (ça sonne un peu dégoûtant, mais bon, exhaustivité)
- Créez une sorte de table de regroupement et ayez un FK sur la table d'origine. (Cela soulève beaucoup de questions. La table de regroupement n'aurait qu'un nombre; pourquoi même la table? Rendre FK NULLable ou avoir des groupes avec une seule ligne associée?)
Quels sont les principaux avantages et inconvénients de ces moyens, et bien sûr, y a-t-il un moyen auquel je n'ai pas pensé?
Voici un SQLFiddle avec lequel jouer: http://sqlfiddle.com/#!12/7ee1a/1/0 . (Il se trouve que c'est PostgreSQL car c'est ce que j'utilise, mais je ne pense pas que cette question soit très spécifique à PostgreSQL.) Il stocke actuellement à la fois la relation et son inverse à titre d'exemple.