- PR -

横長表示する必要があるテーブルの設計について

投稿者投稿内容
hako
会議室デビュー日: 2008/06/19
投稿数: 4
投稿日時: 2008-06-19 19:51

初めて投稿させていただきます。
現在、次のような業務でテーブル設計を行っております。

目的:全国で開催される展示会と、その会場についての管理
概要:全国の100都市程度で展示会が、毎月の頻度で開催される。
月ごとにどの会場で開催されるかは変わる。
(例:東京会場は毎月開催。那覇会場と熊本会場は一月置きに、交互に開催。北見会場は3ヶ月に1回、稚内は6月に1回のみ・・・など)
開催都市は、将来増減する可能性がある。
なお、開催日は全国同日で、別途開催日テーブルがある。

ユーザは、開催日の一覧から選択→地域一覧から選択
     →該当月に開催している都市の一覧から、会場を選択
といった手順をとります。
管理者は、およそ次年度分の開催日・開催都市および都市で開催されるパターンを入力します。

このときテーブルの設計で困っています。
開催パターンは次年度もほぼ同じである予定であること、100都市近くあることから
毎年、都市ごと月ごとに「開催」「非開催」を選択するのは回避したいです。
横長にして「開催都市名:4月開催有無:5月開催有無:...」というマスタメンテナンス画面を作成すれば管理が楽だと思うのですが、良い案がありません。
現在、DB2 v8.2とASP.netで開発しています。

今のところ、次のような設計を考えていますがどうも良くない気がします。
どのようなパターンが良いのでしょうか。

■開催日テーブル
 開催日 | 申込開始日 | 申込終了日
■都市テーブル
 開催地域コード | 地域名 | 開催都市コード | 都市名 | 4月開催フラグ | 5月開催フラグ |....
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2008-06-19 20:02
■開催日テーブル
 開催日 | 申込開始日 | 申込終了日
■都市テーブル
 開催地域コード | 地域名 | 開催都市コード | 都市名 |

■都市開催テーブル |開催日 |開催都市コード |

でできませんか ちなみに直観です
hako
会議室デビュー日: 2008/06/19
投稿数: 4
投稿日時: 2008-06-20 09:39
引用:

七味唐辛子さんの書き込み (2008-06-19 20:02) より:
■都市テーブル
 開催地域コード | 地域名 | 開催都市コード | 都市名 |

■都市開催テーブル |開催日 |開催都市コード |



七味唐辛子さん、ありがとうございます。
テーブルの正規化、ってことではこれが正しいような気がするのですが
「都市名:4月開催有無:5月開催有無:6月階差有無・・・」
という並べ方にする結合方法がわかりません。
(動的にフィールド数が変化するようなSQL文になるとしたら、そもそも不可能?
 Select式に12ヶ月分の何かを書けばいい?)

発想を変えて「12か月分×100都市」を効率的に編集できればなんでもいいような気がするのですが、やっぱりサイズを考えると上記の、左側に都市名が並び上側に12か月分が整列するしか無いような・・・。
何かいいアイデアがあればおねがいします。
test
会議室デビュー日: 2008/04/01
投稿数: 9
お住まい・勤務地: 古の都
投稿日時: 2008-06-20 12:04
pivotとか?
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2008-06-20 12:59
100都市をまとめて編集することに無理があるのでは
普通なら 東海、関西 関東とがグループ分けして対応するのでは
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2008-06-20 13:17
正規化されたテーブルがあったとして、手抜きですがこんなクエリでいけませんか

SELECT 開催都市名,
CASE WHEN COUNT(CASE 開催日 WHEN 4月だったら THEN 開催日 END) > 0 THEN '開催' END AS [4月開催フラグ],
CASE WHEN COUNT(CASE 開催日 WHEN 5月だったら THEN 開催日 END) > 0 THEN '開催' END AS [5月開催フラグ],
...
_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for VSTO (Jul 2008 - Jun 2009)
Hello Another World!
.NET 勉強会 / ヒーロー島
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2008-06-20 14:21
横並べに表示したいという 問題は定期的にでてくる質問ですが、
受け取り側?で取得した結果をぐるぐる加工しても作ることもできます。
エレガントにSQLで一発で取得したいというのが質問者の意図だと思うが....
できなくはないです。



hako
会議室デビュー日: 2008/06/19
投稿数: 4
投稿日時: 2008-06-20 14:35
引用:

七味唐辛子さんの書き込み (2008-06-20 14:21) より:
受け取り側?で取得した結果をぐるぐる加工しても作ることもできます。
エレガントにSQLで一発で取得したいというのが質問者の意図だと思うが....


Asp.netのGridViewに表示するのが簡単かな、と思いまして・・・。
SelectはうまくいってもUpdateで結局ぐるぐるSQL回さないといけないですね。
12か月分のSQLをぐるぐると。

引用:

ueさんの書き込み (2008-06-20 14:21) より:
正規化されたテーブルがあったとして、手抜きですがこんなクエリでいけませんか
SELECT 開催都市名,
CASE WHEN COUNT(CASE 開催日 WHEN 4月だったら THEN 開催日 END) > 0 THEN '開催' END AS [4月開催フラグ],


GROUP BY 開催都市名、ですね。
参照だけだったらこれでいけますね!
問題は更新処理ですね。開催→中止にするには、DELETEを発行して、中止→開催にするにはInsertを発行。
でも、どこに変更があったのか分からないから・・・
@ひとつの都市に12個ボタンが並び、ボタンを押すと一月分ごとに、DELETEないしINSERTのSQL発行する(これなら同時実行の楽観的ロックも可能)
Aひとつの都市にチェックボックスが12個並び、右端とかに登録ボタン。登録を押すと12か月分の処理。DeleteやInsertの判定が難しいのが難点。いったん12ヶ月全部削除。

・・・@の方法で考えてみます。
ueさん、七味唐辛子さんありがとうございます。

スキルアップ/キャリアアップ(JOB@IT)