2009-06-11 13 views
1

ich mit Punkt das folgende Lookup RasterVerschieben von Daten von einem Gitter in eine Datenbank

x A B C D 
A 0 2 1 1 
B 2 0 1 1 
C 1 1 0 1 
D 1 1 1 0

Denken dieser ähnlich dem Handlungsreisende haben zu zeigen, obwohl der Algorithmus für dieses Problem nicht relevant ist. Es ist eher wie ein Nachschlagen von A-> B

Was wäre der beste Weg, um in einer Datenbank zu speichern, da die Zeit die gleichen beiden Richtungen ist. A nach B 2 und B zu A 2

 
Start End Time 
A  B  2 
A  C  1 
B  A  2 
etc 

Dadurch scheint, wie es alle Daten dupliziert werden, die kein gutes Design sein würde.

Irgendwelche Gedanken, die der beste Weg wäre, dies zu implementieren?

Antwort

1

Speichern Sie die doppelten Zeilen nicht. Sie einfach eine Auswahl wie folgt aus:

select * 
from LookupTable 
where (Start = 'A' and End = 'B') 
    or (Start = 'B' and End = 'A') 
1

mit OrbMan Zustimmen. Sie können eine Konvention übernehmen, um entweder das obere Dreieck oder das untere Dreieck zu speichern. und nachdem Sie dieses Dreieck aus der Datenbank geladen haben, spiegeln Sie es einfach. Tun Sie dies im db-Streamer, und loader sollte das Verhalten an einer Stelle einkapseln/lokalisieren.

Oh, eine andere Sache, sollten Sie wahrscheinlich eine Matrix-Implementierung verwenden, die ähnlich ist, so dass ein [i, j] a [j, i] zurückgibt, wenn i> j, 0 wenn i == j. Sie bekommen den Punkt ... Dann müssen nur die Elemente speichern und laden, wo i<j.

+0

+1 - gute Idee für Matrix-Implementierung – RedFilter

Verwandte Themen