2009-05-03 1 views
1

Ich habe eine Anwendung, in der das Datenbank-Back-End ungefähr 15 Nachschlagetabellen hat. Zum Beispiel gibt es eine Tabelle für Counties wie folgt aus:DB Design: Sortierreihenfolge für Nachschlagetabellen

CountyID(PK) County 
49001  Beaver 
49005  Cache 
49007  Carbon 
49009  Daggett 
49011  Davis 
49015  Emery 
49029  Morgan 
49031  Piute 
49033  Rich  
49035  Salt Lake 
49037  San Juan  
49041  Sevier 
49043  Summit 
49045  Tooele 
49049  Utah  
49051  Wasatch 
49057  Weber 

Die Benutzeroberfläche für diese App eine Reihe von Kombinationsfelder an verschiedenen Orten für diese Lookup-Tabellen hat, und mein Mandant hat, dass die Boxen Liste in diesem Fall gefragt:

CountyID(PK) County 
49035  Salt Lake 
49049  Utah 
49011  Davis 
49057  Weber 
49045  Tooele  
'The Rest Alphabetically 

Der beste Plan, den ich um dies zu erreichen müssen, ist für SortOrder (numerisch), eine Spalte zu jeder Lookup-Tabelle hinzuzufügen. Ich hatte einen Kollegen, der mir sagte, dass er dachte, dass die Tische die 3rd-Normal-Form verletzen würden, aber ich denke, die Sortierreihenfolge hängt immer noch vom Schlüssel und nur vom Schlüssel ab (obwohl der Rest der Liste alphabetisch ist).

Ist das Hinzufügen der SortOrder Spalte die beste Möglichkeit, oder gibt es eine bessere Möglichkeit, die ich gerade nicht sehe?

Antwort

4

Ich stimme mit @cletus überein, dass eine Sortierreihenfolge-Spalte ein guter Weg ist und 3NF nicht verletzt (weil, wie Sie sagten, die Sortierreihenfolge-Spalteneinträge funktional von den Kandidatenschlüsseln der Tabelle abhängen).

Ich bin mir nicht sicher, dass ich zustimme, dass alphanumerisch besser als numerisch ist. Im speziellen Fall von Landkreisen werden selten neue geschaffen. Aber es ist nicht erforderlich, dass die zugewiesenen Nummern sequenziell sind; Sie können sie beispielsweise mit Nummern versehen, die ein Vielfaches von Hundert sind, so dass genügend Platz für Einfügungen bleibt.

1

Ja, ich stimme zu, dass eine Spalte für Sortierreihenfolgen die beste Lösung ist, wenn die Anforderungen eine benutzerdefinierte Sortierreihenfolge wie die von Ihnen angegebene erfordern. Ich würde jedoch nicht mit einer numerischen Spalte gehen. Wenn die Daten alphanumerisch sind, sollte die Sortierreihenfolge alphanumerisch sein. Auf diese Weise können Sie den Wert mit dem Feld "County" versehen.

Wenn Sie ein numerisches Feld verwenden, müssen Sie die gesamte Tabelle (möglicherweise) neu sequenzieren, wenn Sie einen neuen Eintrag hinzufügen. Also:

Spalten: ID, County, SortOrder

Seed:

UPADTE County SET SortOrder = CONCAT('M-', County) 

und für die Sonderfälle:

UPDATE County 
SET SortOrder = CONCAT('E-' . County) 
WHERE County IN ('Salt Lake', 'Utah', 'Davis', 'Weber', 'Tooele') 

Diskutierbar können Sie eine weitere Markierung Spalte setzen, um Zeigen Sie an, dass diese Einträge speziell sind.

+0

Thx - Im Allgemeinen mein Nachschlagen ta bles sind 'statisch' und das längste ist dieses Sample für Counties in 29 Zeilen. Ich bin mir nicht sicher, was Sie unter "Saatgut mit dem Wert im County-Feld" verstehen.Damit meinst du die ersten X Zeichen des Namens in der SortOrder Spalte zu speichern? Würdest du dann ein a, b, c oder 1, 2, 3 an die Saite anhängen? –

+0

Das Setzen von "Utah" oder "autah" ist einfacher als 5 in die Sortierreihenfolge zu setzen, da der Alpha-Wert nichts anderes bedeutet, also direkt eingefügt werden kann ohne Abhängigkeiten von anderen Werten wie eine numerische Sortierreihenfolge. – cletus

0

Ich ging mit numerischen und großen Vielfachen.

Auch mit der CONCAT (‚E‘ .. Beispiel, ich habe nicht die erforderliche Sortierreihenfolge. Das würde ich Davis, SL, Tooele ... und Salt Lake muss zuerst sein.

I endete mit Vielfachen von 10 und zugeordnete nicht-special-Art ein Wert wie 10000. auf diese Weise Einträge für jeden Nachschlag die Ansicht

ORDER BY SortOrder ASC, OtherField ASC 

ein anderer Programmierer hat mit DECODE in Oracle vorgeschlagen, oder CASE-Anweisungen in SQL Server, aber das ist eine allgemeinere Lösung. YMMV.