Mam tabelę, w której wiersze mogą być ze sobą powiązane, i logicznie związek przebiega w obie strony (w zasadzie jest bezkierunkowy) między dwoma rzędami. (A jeśli zastanawiasz się, tak, to naprawdę powinien to być jeden stół. Są to dwie rzeczy dokładnie tego samego logicznego bytu / typu). Mogę wymyślić kilka sposobów na przedstawienie tego:
- Przechowuj relację i jej odwrotność
- Przechowuj relację w jeden sposób, ogranicz przechowywanie bazy danych w inny sposób i miej dwa indeksy o przeciwnych zamówieniach dla FK (jeden indeks to indeks PK)
- Zapisz relację w jedną stronę za pomocą dwóch indeksów i pozwól, by i tak wstawić drugą (brzmi trochę pechowo, ale hej, kompletność)
- Utwórz jakiś stół grupujący i umieść na nim FK na oryginalnym stole. (Podnosi mnóstwo pytań. Tabela grupowania miałaby tylko liczbę; dlaczego w ogóle miałaby tabelę? Uczynić FK NULLable lub mieć grupy z jednym wierszem powiązane?)
Jakie są główne zalety i wady tych sposobów i oczywiście jest jakiś sposób, o którym nie myślałem?
Oto SQLFiddle do zabawy: http://sqlfiddle.com/#!12/7ee1a/1/0 . (Zdarza się, że jest PostgreSQL, ponieważ tego właśnie używam, ale nie sądzę, że to pytanie jest bardzo specyficzne dla PostgreSQL.) Obecnie przechowuje zarówno relację, jak i jej odwrotność, jako przykład.