人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLの構造について質問です。

登録フォームに「□??□?」と入力する箇所があるとします。
□にはセレクトメニューで1から99までの数字を選択し、登録します。

こういうフォームがある場合の、MySQLの構造はどのようにしたらいいのでしょうか?
↓の方法以外で教えて下さい。

ALTER TABLE `tatemono` ADD `m2_1` INT( 11 ) NOT NULL ,
ADD `m2_2` INT( 11 ) NOT NULL ;

※MySQL4.x系でお願いします。
※後の表示・検索時にも利用出来る構造を望みます。

●質問者: kt26
●カテゴリ:ウェブ制作
✍キーワード:ADD ALTER MySQL セレクト 入力
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● chuken_kenkou
●27ポイント

既存の表へ、列追加という形で定義するのですか?

CREATE TABLEとALTER TABLEの両方で、DDLの管理が面倒にならないでしょうか?

SHOW CREATE TABLEでの生成結果を、DDLとして管理するならいいですが。

MySQLのALTER TABLEは、他のRDBMSに比べ特殊です。列追加する位置を指定できたり、NOT NULLが指定できますが、その理由は以下のような内部処理を行っているからです。

(1)変更前の定義+変更後の定義で、新しい表を定義

(2)変更前の表から、変更後の表へ全データをコピー

(3)変更前の表を削除し、変更後の表の名称変更

つまり、格納データ数により、処理時間が極端に長くなる場合があります。

1?99までの管理なら、列のデータ型はTINYINTで十分です。

NOT NULLの指定は、あると不都合にならないでしょうか?

母体データ数は、最大で何行くらいになるのでしょうか?

表の構成列が全部分からないので、具体的な数値は示せませんが、数千件くらいがテーブルスキャン(表のデータ部を探す)とインデクススキャン(インデクス上で探す)のどちらが性能が出るかの境界になります。


表の定義(該当列のみの抜粋)

 `m2_1` TINYINT,
 `m2_2` TINYINT,
◎質問者からの返答

例で示したSQL句についてはphpMyAdminで作成したものをコピーして貼り付けたので、いくぶんおかしいSQL文になっているかもしれません。


また、あくまで私が出したSQL文についての意図は「既存のテーブルにm2_1とm2_2のフィールドを追加する方法」という例として出しただけです。

そして、その方法以外に、出来れば「1つのフィールド内で対応する構造にはできないものか?」っと思い、質問した次第です。


「○?○まで」という値を保持する場合、通常なら2つの関連するフィールドをテーブルに作成すればよいですが、同じように範囲を入力するフィールドがあった場合、フィールドの数が増えすぎるのではないか?っとも懸念しています。(ちなみにわけあって正規化はしません)


質問文の説明が足りず、混乱を招いたのでしたら、申し訳ありません。


2 ● b-wind
●27ポイント

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.2 カラム型

MySQL には範囲を指定できる型や配列型はありません。

他の RDBMS には存在する場合もありますが、汎用性に欠けます。


素直に2フィールド追加するのがたいていの場合ベストです。

◎質問者からの返答

やっぱりそうなりますよね。


3 ● Yota
●26ポイント

アプリケーション側のオブジェクト(配列)として保存したらどうでしょう。

例えばPHPなら、こんな感じで。

$srcAry = array(40,70) ;

$serAry = serialize($srcAry) ;

$link = mysql_connect('localhost', 'root', 'pass') ;

$db = "test" ;

mysql_select_db($db,$link) ;

$sql0 = 'ALTER TABLE tatemono ADD COLUMN arytxt TEXT NOT NULL' ;

mysql_query($sql0,$link);

$sql1 = "INSERT INTO hoge (arytxt) VALUES ('$serAry')" ;

mysql_query($sql1,$link);

$sql2 = "SELECT arytxt FROM tatemono" ;

$res = mysql_query($sql2,$link);

while($row = mysql_fetch_array($res)){

print_r(unserialize($row[0])) ;

}

mysql_free_result($res) ;

mysql_close($link) ;

◎質問者からの返答

例を提示していただき、ありがとうございます。じっくり検討してみます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ