Ho una tabella in cui le righe possono essere correlate tra loro e, logicamente, la relazione va in entrambe le direzioni (sostanzialmente, è senza direzione) tra le due righe. (E se ti stai chiedendo, sì, questo dovrebbe davvero essere un tavolo. Sono due cose della stessa identica entità / tipo logico.) Posso pensare a un paio di modi per rappresentare questo:
- Memorizza la relazione e il suo contrario
- Archivia la relazione in un modo, impedisce al database di archiviarlo nell'altro modo e dispone di due indici con ordini opposti per gli FK (un indice è l'indice PK)
- Memorizza la relazione in un modo con due indici e consenti comunque di inserire il secondo (sembra un po 'schifoso, ma ehi, completezza)
- Crea una sorta di tabella di raggruppamento e disponi di un FK nella tabella originale. (Solleva molte domande. La tabella di raggruppamento avrebbe solo un numero; perché anche avere la tabella? Rendere FK NULLable o avere gruppi con una singola riga associata?)
Quali sono alcuni dei principali pro e contro di questi modi e, naturalmente, c'è un modo a cui non ho pensato?
Ecco un SQLFiddle con cui giocare: http://sqlfiddle.com/#!12/7ee1a/1/0 . (Sembra essere PostgreSQL poiché è quello che sto usando, ma non penso che questa domanda sia molto specifica per PostgreSQL.) Attualmente memorizza sia la relazione che il suo contrario solo come esempio.