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


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

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

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

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

回答の条件
  • 1人2回まで
  • 登録:2007/09/04 00:59:23
  • 終了:2007/09/04 11:57:07

回答(3件)

id:chuken_kenkou No.1

chuken_kenkou回答回数722ベストアンサー獲得回数542007/09/04 01:23:28

ポイント27pt

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

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,
id:kt26

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


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

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


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


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

2007/09/04 02:09:34
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402007/09/04 09:39:58

ポイント27pt

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

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

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


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

id:kt26

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

2007/09/04 11:56:36
id:Yota No.3

Yota回答回数453ベストアンサー獲得回数282007/09/04 10:48:53

ポイント26pt

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

例えば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) ;

id:kt26

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

2007/09/04 11:56:55
  • id:KUROX
    >「○~○まで」という値を保持する場合、通常なら2つの
    >関連するフィールドをテーブルに作成すればよいですが、
    >同じように範囲を入力するフィールドがあった場合、
    >フィールドの数が増えすぎるのではないか?っとも懸念し
    >ています。

    MYSQLの特性と相談でしょうけど、DB一般としては
    質問文の持ち方以外は、あまり思いつきませんが・・。

    フィールド数の多い少ないという感覚も違うかもしれません。
    200個ぐらいのフィールドなら、多いとは今の時代思わないと
    思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません