2009-05-03 13 views
1

データベースのバックエンドには約15個のルックアップテーブルがあるアプリケーションがあります。例えば、このような郡のためのテーブルがあります:DBデザイン:ルックアップテーブルの並べ替え順序

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 

このアプリのUIは、これらのルックアップテーブルのためのさまざまな場所でコンボボックスの数を持っており、私のクライアントは、この場合には、そのボックスの一覧を求めています。

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

これを達成するための私が持っている最高の計画はSORTORDER(数値)のために、各ルックアップテーブルに列を追加することです。私は同僚に、テーブルが第3正規形に違反すると思っていたと教えてくれましたが、ソート順は依然としてキーとキーだけに依存していると思います(残りのリストはアルファベット順です)。

これを行うには、SortOrder列を追加するのが最善の方法ですか、それとも私が見ていないよりよい方法がありますか?

答えて

4

@cletusには、ソート順の列が良い方法であり、3NFに違反しないことに同意します(あなたが言ったように、ソート順の列の項目は機能的に表の候補キーに依存します)。

英数字は数字よりも良いと私は確信していません。郡の特定のケースでは、作成されることはめったにありません。しかし、割り当てられる番号は連続的である必要はありません。たとえば、100の倍数の数字を割り当てることができます。挿入には十分な余裕があります。

1

はい私が指摘したようなカスタムソート順が必要な場合は、ソート順の列が最適です。私は数字の列には行かないだろう。データが英数字の場合、ソート順は英数字でなければなりません。そうすれば、あなたは郡のフィールドにある値を使って値を設定することができます。

数値フィールドを使用する場合は、新しいエントリを追加するたびにテーブル全体(潜在的に)を並べ替える必要があります。だから、:

列:ID、郡、SORTORDER

シード:

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

及び特別な場合のために:

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

おそらくあなたがにして別のマーカー列を配置することそれらのエントリが特別であることを示します。

+0

Thx - 一般的に私のルックアップta blesは「静的」で、これまでのところ最も長い29行の郡のサンプルです。私はあなたが「郡の畑の価値を持つ種」によって何を意味するのかは分かりません。それはSortOrder列に名前の最初のX文字を格納するという意味ですか?文字列にa、b、cまたは1,2,3をプリペンドしますか? –

+0

アルファ値が他のものに関係しないので、並べ替え順序の列に5を入れるよりも、「Utah」または「aUtah」を置くほうが簡単です。したがって、ソート順のように他の値に依存しないで直接挿入できます。 – cletus

0

私は数値と大きな倍数で行きました。

でもCONCAT(「E-」..例で、私は必要なソート順を得ることはありません。私にデイビス、SLを与えるだろう、トゥーレ...ソルトレイクは、最初にする必要があります。

私は10の倍数を使用して終了し、割り当てられた非特殊なソートは10000のような値をエントリそのように各検索のビューが

ORDER BY SortOrder ASC, OtherField ASC 

別のプログラマがでOracleでDECODE、またはCASEステートメントを使用して提案することができSQL Serverを使用していますが、これはより一般的なソリューションです。YMMV。

関連する問題