PHP+PostgreSQLを勉強中です。

PostgreSQLのデータ型についてについて教えてください。(PHPで)

あまりに初歩的な質問ですがよろしくお願いします。
なぜデータ型が色々あるのでしょうか?
書籍を見ると例えば商品の単価には「INTEGER」を使うと書いてありますが、その理由が見当たりません。
素人考えではどんな項目でも「TEXT」を使えば簡単なのにと思うのですが、
「TEXT」にしないでわざわざ「INTEGER」にするのには何らかの理由があると思っています。
その何らかのメリットやデメリットを教えてください。
例えば○○○というデータ型を使うと「データのサイズは大きくなるが検索が早くなる」など。
こんな感じで下記の項目にはどのデータ型を使うのがおすすめなのでしょうか。
またその理由もあるようでしたらお願いします。

個人情報データの
・年令
・郵便番号
・住所

ブログやサイトデータの
・タイトル
・URL
・説明文

商品データの
・商品名
・価格
・商品説明

回答の条件
  • 1人2回まで
  • 登録:2006/05/28 21:26:11
  • 終了:2006/05/28 22:57:12

ベストアンサー

id:pmakino No.4

まきのっぴ回答回数355ベストアンサー獲得回数282006/05/28 22:49:22

ポイント50pt

単価は通常正の整数ですから、整数型の INTEGER を使うのが普通ですが、もしこれを TEXT 型にした場合、以下のようなことが起きます。

・データ保存領域がより多く必要になります。

 INTEGER なら固定長4バイトで済むところ、TEXT だと (DBMS によりますが、多くの場合) 5~14バイト程度の可変長になります。

・可変長のデータの内部処理は固定長のデータの内部処理よりも手間がかかります。

 よって僅かですが処理が遅くなります。

・数値の 10 と文字列の '10' は、人間の見た目には一緒でも、コンピュータの内部では別物です。

 DB に数値の 10 を突っ込もうとした時、対象の列が TEXT 型になっていたら、

 いちいち数値の 10 を文字列の '10' に変換する内部処理が入ります。

 よって無駄な処理が入り、遅くなります。

 さらに、文字列は数値と違って足したり引いたり比較したり…といったこともできません。

・INTEGER 型で列を作っておけば、うっかり間違って数値以外のデータを挿入しようとしてもエラーとなり挿入できません。

 TEXT 型では何でも入れられるので、全角の数値だろうと日本語だろうと入ってしまいます。

 これは、後から処理する時に七面倒な処理を入れなければならなくなる場合があります。

等々、何一つ良いことがありません。


型の使い分けですが、

・数値が入る列であれば数値型、日付が入るなら日付型等、それぞれに用意された専用の型を使用し、

 それらに当てはまらない文字列が入るなら文字列型

・想定する最大の大きさや長さのデータが入る最小の大きさに留める

・文字列は長さが(ほぼ)固定なら CHAR 型、長さが個々別々なら TEXT 型か、想定する長さに上限があるなら VARCHAR 型

を原則に考えます。


…と考えると、一例としては以下のようになるのではないでしょうか。

・年令 = SMALLINT

・郵便番号 = CHAR(8)

・住所 = TEXT

・タイトル = TEXT か VARCHAR

・URL = TEXT か VARCHAR

・説明文 = TEXT か VARCHAR

・商品名 = TEXT か VARCHAR

・価格 = INTEGER

・商品説明 = TEXT か VARCHAR

id:worldtravel

ありがとうございましと。

わからないことが全てわかりました。

2006/05/28 22:55:20

その他の回答(3件)

id:icchan0000 No.1

icchan0000回答回数85ベストアンサー獲得回数52006/05/28 22:07:28

ポイント30pt

具体的に例示されているINTEGERについて述べますと、

「データサイズを抑制でき、かつ効率良く演算できる」データ型ということになります。

たとえば「12345」という数を格納するのに、テキスト型にすれば単純に言って「5バイト」必要になりますが、INTEGER型では4バイト(一般的なRDBの場合)で済みます。

また、小数点の有無も、演算効率に大きな影響を与えますので、数値型でも、整数型と小数点を扱える型とが用意されていたりします。


データ型とは、RDBが「効率的にデータを扱える」ためにいろいろと分けられています。なので、せっかくRDBをお使いになるのならば、すべてテキスト型というふうにはせず、必要に応じてデータ型を分けたほうが、よりRDBの能力の恩恵を受けやすいという意味で、「正しいあり方」だとは思います。

もちろん、そういうのを割り切ってすべてテキスト型で押し通しても、利用に問題なければ、それがそれで「間違っている」とも言えないとは思いますが。


以下、一般的な考え方で、例示されている項目に相応しいデータ型を記してみます。

・年令:数値(INTEGER)型 大小比較などを行うことが多い項目と考えられるので、演算に有利な数値型が望ましいと思います。

・郵便番号:文字型 0で始まる郵便番号もありますし、大小比較よりは一致しているかどうか?という使い方のほうが多いと思いますので、無理に数値型にするよりは、ハイフンも使って文字型にしたほうが、素直だと思います。ただしこれは、数値型のほうが望ましいとする考え方もありうると思います。

・住所:間違いなく文字型 文字型以外では無理です。

・タイトル:同上

・URL:同上

・説明文:同上

・商品名:同上

・商品説明:同上

・価格:数値型 大小比較や加減乗除などの計算に利用することが多いと考えられますので、演算速度の速い数値型が望ましいと思います。

id:worldtravel

ありがとうございます。

郵便番号の「頭が0」というのは素人は間違えそうですね。

以前エクセルで知らない内に頭の0が消されて大変なことになったのを思い出しました。

2006/05/28 22:49:58
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912006/05/28 22:14:59

ポイント30pt

http://www.postgresql.jp/document/pg721doc/user/datatype.html

データベースに限らず、プログラムの場合データを表現できる範囲が異なります。

テキストは、文字列を扱えますが、そのままでは、足したり引いたり、といった計算が出来ません。

なので、通常データ型は扱う範囲と、性質によって選定します。

下記の例は、

個人情報データの

・年令

integer、もしくは日付型で生年月日から計算

・郵便番号

varchar(8)

・住所

text

ブログやサイトデータの

・タイトル

text、もしくは上限を決めるのであれば、varchar

・URL

text、もしくは上限を決めるのであれば、varchar

・説明文

text

商品データの

・商品名

text、もしくは上限を決めるのであれば、varchar

・価格

bigint

・商品説明

text

といった感じでしょうか。整数で表せない数値を扱いたいときはdouble などを使います。

ただ、数値であっても電話番号や郵便番号は、文字列方を使用するのが普通だと思います。

id:worldtravel

ありがとうございます。

「絶対に100バイト以内」という項目では

textとvarchar(100)とするのとでは違いはあるのでしょうか?

検索が早くなるなど。。。

一般的にはどちらを使うのでしょうか?

追記

他の方が答えてくださいましたので疑問は解決しました。

ありがとうございました。

2006/05/28 22:54:51
id:Allashe No.3

Allashe回答回数59ベストアンサー獲得回数52006/05/28 22:21:01

ポイント30pt

 データ型は、そのデータの内容や、そのデータをコンピュータから見て効率の良い持ち方、悪い持ち方があるため、いくつかの種類に分かれています。

 通常、数字を扱う場合で整数だけを扱う場合は整数型、小数点を扱う場合は浮動小数点型、文字列を扱う場合はテキスト型。(テキスト型にもいろいろありますが)となります。

 判りやすい例を挙げれば、例えば整数型の変数A、Bがあり、それぞれ

A=10、B=20だった場合、

 A+B=30

 となりますが、これがもしテキスト型だった場合は

 A+B="1020"

 と、横にくっついてしまいます。

 さらにAが整数型、Bがテキスト型だと、A+Bはエラーになります。(データ型不一致エラー。ただし、MicrosoftのVBAなんかだと、勝手にA又はBをもう一方のデータ型に変換してエラーを出さずに処理する場合もありますが)

 ですので、メリット/デメリットという問題ではなく、データ型はきちんとしないとエラーになるのです。

 細かい話ですが付け足しますと、メモリ使用量も違います。コンピュータ的な話ですが、0から255の整数だと1バイトですみますが、テキストで255だと3バイト(3文字あるので)必要になります。

 ご質問の項目では、年齢と価格は整数型、それ以外はテキスト型になります。郵便番号はテキストです。"0010001"は整数型だと10001になってしまうからです。

id:worldtravel

ありがとうございました。

「細かい話...」は「なるほど」と私には嬉しい情報でした。

2006/05/28 22:47:45
id:pmakino No.4

まきのっぴ回答回数355ベストアンサー獲得回数282006/05/28 22:49:22ここでベストアンサー

ポイント50pt

単価は通常正の整数ですから、整数型の INTEGER を使うのが普通ですが、もしこれを TEXT 型にした場合、以下のようなことが起きます。

・データ保存領域がより多く必要になります。

 INTEGER なら固定長4バイトで済むところ、TEXT だと (DBMS によりますが、多くの場合) 5~14バイト程度の可変長になります。

・可変長のデータの内部処理は固定長のデータの内部処理よりも手間がかかります。

 よって僅かですが処理が遅くなります。

・数値の 10 と文字列の '10' は、人間の見た目には一緒でも、コンピュータの内部では別物です。

 DB に数値の 10 を突っ込もうとした時、対象の列が TEXT 型になっていたら、

 いちいち数値の 10 を文字列の '10' に変換する内部処理が入ります。

 よって無駄な処理が入り、遅くなります。

 さらに、文字列は数値と違って足したり引いたり比較したり…といったこともできません。

・INTEGER 型で列を作っておけば、うっかり間違って数値以外のデータを挿入しようとしてもエラーとなり挿入できません。

 TEXT 型では何でも入れられるので、全角の数値だろうと日本語だろうと入ってしまいます。

 これは、後から処理する時に七面倒な処理を入れなければならなくなる場合があります。

等々、何一つ良いことがありません。


型の使い分けですが、

・数値が入る列であれば数値型、日付が入るなら日付型等、それぞれに用意された専用の型を使用し、

 それらに当てはまらない文字列が入るなら文字列型

・想定する最大の大きさや長さのデータが入る最小の大きさに留める

・文字列は長さが(ほぼ)固定なら CHAR 型、長さが個々別々なら TEXT 型か、想定する長さに上限があるなら VARCHAR 型

を原則に考えます。


…と考えると、一例としては以下のようになるのではないでしょうか。

・年令 = SMALLINT

・郵便番号 = CHAR(8)

・住所 = TEXT

・タイトル = TEXT か VARCHAR

・URL = TEXT か VARCHAR

・説明文 = TEXT か VARCHAR

・商品名 = TEXT か VARCHAR

・価格 = INTEGER

・商品説明 = TEXT か VARCHAR

id:worldtravel

ありがとうございましと。

わからないことが全てわかりました。

2006/05/28 22:55:20

コメントはまだありません

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

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

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

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