• ベストアンサー

データ型の存在理由と決定方法は?

テーブルを作成するとき、各列にデータ型を指定しなければなりませんが、そもそもなんでデータ型という物が存在するのでしょうか? いっそのことすべてtext型で扱ってしまった方が、いちいち挿入されるデータを予測してデータ型を決定する必要もないと思うのですが… (integerよりsmallintにした方が動作が速くなるとか、そういう理由なんでしょうか?) また、データ型を決定しなければいけない場合、何を基準にデータ型を決定すればいいのでしょうか。 例えば、掲示板などをデータベースで管理する場合は、ハンドルネームがどれくらいまで長い人がいるのかわからないので、結局text型になってしまいそうですが…

質問者が選んだベストアンサー

  • ベストアンサー
  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.2

>(integerよりsmallintにした方が動作が速くなるとか、そういう理由なんでしょうか?) 基本的にはプログラム言語にintとstring(text)があるのと同じ理由です。 たとえば、たいていの場合intの方がメモリ消費量が少なく、検索やソートも容易です。 あと、stringは基本的に算術対象にできません。 (StrToIntとか使えばできる場合もありますが) >何を基準にデータ型を決定 色々考慮する事項はありますが、基本的にその項目に入りうる最大限動的なデータ型を決定すれば良いかと思います。 特にPostgresだけを使うならvarcharやcharは積極的に使う理由がない限り使う必要はないでしょう。 (問題になるのは移植性くらいかな?) #私は大抵textとintくらいしか使わないです。 #(booleanはintで代用)

その他の回答 (1)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

型があったほうが処理が早いしサイズも小さいほど処理が早いと思います。 ハンドルネームの例では長さ未定で挿入するのではなく例えば100バイト以上のハンドルネームは登録不可として長さを限定するほうが普通ではないでしょうか。 型のないSQLiteというデータベースもあります。

関連するQ&A

  • SQLite3にPHPでデータの更新・追加する方法

    PHP初心者です。 すみません、どなたか教えてください。 SQLite3 のデータベース内にあるテーブルに、同一データがすでにある場合はそのデータを更新、無い場合はデータを追加したいのですが、PHPではどのように書けばよいのでしょうか? 具体的には、hoge.dbの中のテーブル prime_ministers があり、 id 1, name 伊藤博文, origin 長州 id 2, name 黒田清隆, origin 薩摩 上記の2データはすでに保存されているものとします。 そこにデータを追加するのですが、 name 伊藤博文, origin 長州 の場合は、もうすでにテーブル内に伊藤博文のデータがあるので、上書き更新、 name 大隈重信, origin 肥前 の場合は、nameのカラムに大隈重信が無いので、データを追加。 データベースがSQLite3の場合、どのように書けば良いのでしょうか? どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • PerlでSQLiteのデータテーブルを作成し

    PerlでSQLiteのデータテーブルを作成し、作成したテーブルへデータを追加するようにしたいのですが、 下記のように作成し、実行すると、 テーブルの作成のみ、もしくは、既存のテーブルへのデータの追加のみは可能なのですが、 両方処理させると、テーブルの作成のみされて、作成されたテーブルの中身はカラのままです。 #データベースに接続 $dbh = DBI->connect("dbi:SQLite:dbname=c:\\database\\tyumon.db"); open (DATA,"c.dat"); $data = <DATA>; close(DATA); $data = $data+1; $table = "user"; $table .= $data; #テーブル作成実行 $hst = $dbh->do("CREATE TABLE '$table'(name text,area text,tel text,mail text,jikan text, hoka text)"); #レコードの追加(INSERT文の実行) $st = $dbh->do("insert into '$table' values('$data','$name','$area','$tel','$mail','$jikan','$hoka')"); 「c.dat」には、カウントされた数字が入っています。 テーブル名は「user」+カウント数字で作成しています。 データベースと、CGIの勉強を兼ねて作成しているもので、 根本的な間違いなどあるかもしれません。 どなたか、ご指摘いただければ幸いです。

    • ベストアンサー
    • CGI
  • 製品価格の決定方法について

    事業会社が別業界に新規参入するとしたらというケーススタディを行っています。 具体的には、家電メーカーが化粧品を発売というケースですが、そこで製品の価格の決定は何をもって決定されるのか?というところで悩んでいます。 思いつくのは、競合の価格を基準に決定。その価格を基準に販管費、間接費、原価などを決め、それに見合った方法で製品の調達法(国産、海外産、輸入など)を決める。というイメージですが、リアルのケースで別業界に新規参入する場合、どういった形で価格などが決められるのでしょうか? また、価格を決めるには売上げ予測が必要だと思いますが、逆に売上げ予測は製品価格の中のプロモーション予算に大きく左右されると思います。 それだと卵が先か、鶏が先かになってしまいますね。 それは一体どちらが先に決められるのでしょうか?

  • データベースとテーブルを作成する基準について

    独学でMySQLを勉強しているのですが、さまざまな種類のデータが大量にある場合、どのような基準でデータベースやテーブルを分けるのでしょうか? 例えばOKWaveの場合、ユーザーデータを入れるDBとQ&AをいれるDBをわけるのか、それともひとつのDBに別のテーブルとしていれるのか。 掲示板の場合、一つのスレッドでテーブルを一つ作るのか、それとも全てのスレッドを一つのテーブルにいれインデックスをつけて使うのか。 これらのことが使いやすさや拡張性の問題であるのか、速度などに関係するのかわかりません。 データの種類や構成で一概に言えることではないかもしれませんが何か基準を知りたいのでよろしくお願いします。

    • ベストアンサー
    • MySQL
  • 存在しないデータも抽出したい

    AcessMDBで困ってます。 例えば、以下のようなデータで(カンマCSVで記述します) データベース1 ID,NAME 1,おなまえ 2,名前 3,なまえ データベース2 ID,DB1_ID,NAME,開始日,終了日 1,1,4月,2006/4/1,2006/4/30 2,1,6月,2006/6/1,2006/6/30 3,2,2006年度,2006/4/1,2007/3/31 (データベース1のIDとデータベース2のDB1_IDが関連付けされている) とあるとき、以下のようにデータを出力したいのですが・・ ID(オートナンバー),NAME,月,開始日,終了日 1,おなまえ,4月,2006/4/1,2006/4/30 2,おなまえ,6月,2006/6/1,2006/6/30 3,おなまえ,(null),(null),(null) 4,名前,2006年度,2006/4/1,2007/3/31 5,名前,(null),(null),(null) 6,なまえ,(null),(null),(null) そして、where条件として、 2006/4/1が選択された場合 1,おなまえ,4月,2006/4/1,2006/4/30 2,名前,2006年度,2006/4/1,2007/3/31 3,なまえ,(null),(null),(null) 2006/7/1が選択された場合 3,おなまえ,(null),(null),(null) 2,名前,2006年度,2006/4/1,2007/3/31 3,なまえ,(null),(null),(null) 2007/4/1が選択された場合 3,おなまえ,(null),(null),(null) 2,名前,(null),(null),(null) 3,なまえ,(null),(null),(null) このような場合、どのようなSQLをかけばよろしいでしょうか? 言語はVS2003 VB.NET + AccessMDBです。 よろしくお願いします。

  • 複数の項目をまとめてキーに出来ますか?

    一つのテーブルに smallint型のkey1,key2,key3を持つテーブルのデータを これを key1+key2+key3のinteger形式のkeyAとして 他のテーブルに登録したり呼び出したりしたいのですが 可能でしょうか? 例えば key1=123,key2=45,key3=67 というデータを keyA=1234567 というkeyで管理したいのです。 Cにおける構造体のunionの様な呼び出しがしたいのですが・・・

  • phpmyadminでのデータ挿入について

    phpmyadmin(ver3.4.9)を利用しています。 リレーションビューを用いて、以下のようなリレーションを組んだとします。 【商品テーブル】 id name 【売上テーブル】 syouhin_id uriagegaku ※商品テーブルのidと、売上テーブルのsyouhin_idがリレーション 売上テーブルのデータ挿入において、 現在は、syouhin_idのセレクトボックスには、 商品テーブルのidの値が出てきます。 これだと何の商品かよくわからないため、 データ挿入の効率を上げるため、 syouhin_idのセレクトボックスに商品名(nameの値)が出るような方法はありますでしょうか。 あくまでも、データ挿入時に商品名を参照したいのであって、 実際のデータは商品id(idの値)をsyouhin_idに入れたいのです。 つたない説明ですが、ご教授ください。 社内プログラマが急病のため、 プログラムを組んだりすることができず、 phpmyadmin画面内でのデータ挿入となりました。 なにとぞ宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • データベースへのデータの受け渡し

    今データベースとCGIを自分で作り掲示板のような物を作成しています。 その中で、データベースにデータを受け渡す部分を if($syoujyou ne "" and $geninn eq "" and $taisyo eq ""){ $INS = $dbh->prepare("INSERT INTO $DBtable (syurui,syoujyou,geninn,taisyo) VALUES (\'$syurui\',\'$syoujyou\',\'$geninn\',\'$taisyo\')"); $INS->execute or $err2 = "execute"; } 上記のように記述しています。 このままでCGIを実行し、書き込みを行うとデータがデータベースに受け渡されません。 試しにif文を除き強制的に実行してもダメでした。 その代わり、if文を除くと何も書き込まない状態(受け渡しの変数内<(\'$syurui\',\'$syoujyou\',\'$geninn\',\'$taisyo\')>がNULL)だと書き込まれます。 つまりデータベースには何もない状態でテーブルの中にカラムが作成されます。 データベースは create table データベース名 ( id INT(4) AUTO_INCREMENT NOT NULL, syurui TEXT NOT NULL , syoujyou TEXT NOT NULL, geninn TEXT NOT NULL, taisyo TEXT NOT NULL, PRIMARY KEY(id) ) AUTO_INCREMENT = 1; のようにして作っています。 更に、上記の中のINSERT文をprintし、表示された物 INSERT INTO データベースの名前 (syurui,syoujyou,geninn,taisyo) VALUES ('ハード','あ','い','う') を直接プロンプトから実行した場合データは正しく挿入されます。 更にデータを消す文として if(($delpass == '****') and ($delfilid ne "")){ $DELETE = $dbh->prepare("DELETE FROM $DBtable WHERE id=\'$delfilid\'"); $DELETE->execute; $DELETE->finish; } と記述しているのですが、これは正常に動作します。 何がいけないのかが判らないので詳しい方教えてください。

  • mysql データ登録

    phpにてmysqlにデータ登録の流れを作っているのですが、わからないことがあり投稿しました。 簡単に流れを説明しますと mysqlのテーブル(テーブル名member)の構成は id | name だとして phpのフォームで <input type="text" name="name1" value=""> <input type="text" name="name2" value=""> <input type="text" name="name3" value=""> というものを作っています。 ここでフォームのname1、name2、name3をそれぞれ入力したときにmysqlに登録されるのですが、 mysqlのなかに id | name 1 | A 2 | B 3 | C としたいのですが、下記の記述ではできません。 (INSERT INTO `member` SET `name`='$name1',`name`='$name2',`name`='$name3') エラー文はColumn 'name' specified twiceと表示されます。 レコード数は増やしたくないので、何か方法が御座いましたら教えていただけないでしょうか? まだ、PHPを勉強し始めたばかりで困っています。 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • tableからlistboxにデータをならべるにはどうしたよよいのでしょう

    VBを勉強しております。accessをデータベースにしてデータをlistboxに並べたいのですが、なんとかテーブルまではたどりついたのですが、listboxにならびません。WEBや書物を参考に listbox1.databindings.add("text",table,"○○")としてみたのですが だめでした。どのようにするとlistboxにデータがなるぶのでしょう。