Oracleデータベースで列の項目数が1,000列を超える場合、一般的にはどうすればよいのですか?
ある電子機器のテスト結果をデータベースに記録しようとしています。
一つのロットには、測定する端子が2,000個あります。
その各端子を1ミリ秒毎に5秒間測定しているので、1端子につき5,000個のデータが取れます。
ですから、端子数2,000個×測定データ数5,000個=1,000万個のデータが一つのロットから取れることになります。
表計算ソフトで愚直に表を作れば、以下のようになります:
ロット名, 端子名, データ_0ms, データ_1ms, データ_2ms, ・・・, データ_4999ms
Lot_A, Terminal_0001, 0.0, 0, 11, 0,23, ..., 4.98
Lot_A, Terminal_0002, 0.4, 0, 33, 0,43, ..., 5.07
Lot_A, Terminal_0003, 0.2, 0, 28, 0,36, ..., 5.02
:
Lot_A, Terminal_2000, 0.8, 0, 16, 0,32, ..., 4.95
ただ、これをOracleデータベースに移そうとしたら、1,000列以上は作れないとエラーが出ました:
ORA-01792 2
表またはビューに指定できる最大列数は1000 です。
原因: 1001 列以上ある表またはビューを作成しようとしたか、列を追加しすぎたため許容できる最大の列数1000 を超えました。表にある未使用の列も最大列数1000 に含まれることに注意してください。
対処法を検索すると、「列数が1,000個を超えるなんて設計がおかしい」「正規化してないのが悪い」など説教ばかりで、具体的な対処法が書かれたものが見つかりません。
私としては、5秒間(5,000個)のサンプリングでは足りなくて、本当は20秒間(20,000個)ぐらい欲しい気持ちです。
一つ考えたのが、以下のように、列でデータを持つのではなく、行で持つようにして、端子毎にテーブルを作ることです:
端子1テーブル
ロット名, 端子名, データ
Lot_A, Terminal_0001, 0.00
Lot_A, Terminal_0001, 0.11
Lot_A, Terminal_0001, 0.23
:
Lot_A, Terminal_0001, 4.98
端子2テーブル
ロット名, 端子名, データ
Lot_A, Terminal_0002, 0.02
Lot_A, Terminal_0002, 0.40
Lot_A, Terminal_0002, 0.33
:
Lot_A, Terminal_0002, 5.07
しかし、これでは各ロット毎に端子テーブルが2,000個必要になります。
端子同士の比較となると、2,000個のJOINが必要になりますよね。
これが一般的な対処法なのでしょうか?
ということで、「私ならこうする」といった、具体的な対処法を教えて下さい。
Oracle以外のデータベースの例でも構いません。
お礼
ベストアンサーを差し上げます。 なるほど、そのように縦にすればテーブルを分けなくても全部入れることが出来ますね。 そんな風にデータベースを作ってみます。 ご回答ありがとうございました!