SSブログ

テーブル データ型について [テーブル設計]

 テーブル項目のデータ型の決め方は、それぞれの場所の文化とか、過去の資産のしがらみとか、個人の好みとかが出る部分なので、一概になにが正しいとは言えないところがあります。
 ここに書くことは私がそう思うだけのことなので、自分の意志をお持ちの方はその道を貫いて頂いて、まだ無垢の人はあまり鵜呑みにしないでください。 

 あ、一応ここはACCESSのテーブルでの話をします。
OracleとかSQLServerはまた違う世界ですので。

 とりあえず、データ型についていろいろです。

・テキスト型
 正しい使い方は、文字を入れる用途に使うこと。例えば、名称、単位名、名前、郵便番号、住所、電話番号・・・おや、意外と出てこない。
 間違った使い方は、数字しか使わないコード項目、日付、時刻に用いること。JANコードとかは13桁あることと、前ゼロやいろんな特殊事情が絡むことがあるので、テキスト型にしておくのが無難。
 数字しか使わないコード項目をテキスト型すると、数値と数字の違いで面倒なことになる可能性があるので止めましょう。日付、時刻もテキスト型にしているのをよく見ますが、これも日付型があるので。
 テキスト型はいろんな処理で不利になる(処理時間がかかる)ことが多いので、間違った使い方をすると、パフォーマンス悪化の原因になります。
 フィールドサイズに文字数を指定します。バイト数ではありません。半角英数も全角漢字もすべて1文字でカウントします。余談ですが、ACCESSはUnicodeだから、全部2バイト扱いです。
 ・・・では、例のVistaの4バイト文字は?
フィールドサイズを「6」にして、4バイト文字を入れてみたところ、3文字しか格納できませんでした。6文字→12バイト、4バイト文字が3文字で12バイト。とりあえず格納できただけすごいかも。が、画面上では、漢字の真ん中にカーソルが来たりして、怪しさ満点でした。(ACCESS2000で実験)

・メモ型
 255文字を超えるテキストを扱いたいときに使います。私は使ったことないです。
ちなみにOracleはvarchar2で4000バイト、SQLServerだとcharまたはvarcharで8000文字まで指定できます。

・数値型
 もちろん数値に使います。例えば、金額、原価単価、売価単価、数量、重量・・・うーん、またまたあんまり出てこない。
 続いて数値型のフィールドサイズについて。

・バイト型
・整数型
・長整数型

 それぞれに値の範囲があって、その範囲内ならそれを指定するのが良いと思われがちですが、この指定は使わない事をおすすめします。値の範囲からして内部処理を察するに、値を扱う上ではもっとも効率の良いデータの持ち方なのですが、一般的な業務システムには適合しません。業務システムを構築する場合、項目の値の範囲は桁数でお客様と話をして決めるので、十進型の桁数指定が都合が良いんです。説明するのに、「ここは2,147,483,647以内で入力して下さい。」なんてかまずに説明できないし。
 もっとも、金額の項目あたりになると、長整数型でも足りません。オーバーフローの原因で一番多いのが、「項目が長整数型だった」なんです。テーブルに限らず、VBの処理でもね。

・単精度浮動小数点型
・倍精度浮動小数点型

 一般的なシステムでは使いません。私も使ったことがありません。よく言われることですが、これらの型は、科学技術計算や確率統計の値を扱う時に使用します。
 まちがっても、小数点ありの項目だからと言って、浮動小数点型にしないで下さい。これらの項目は、ある値そのものを指し示す表現ではなく、指したい値に限りなく近い値を持つように作られているからです。浮動小数点というデータ表現の仕組み自体が難しいので、それを理解してから使いましょう。(誤差とか桁落ちとかイコール演算とかその辺の知識なしで扱うのは危険です)
 通常、小数点の値は、固定小数点で扱うのが一般的です。
 そーいえば昔、浮動小数点の項目を集計したら、1の桁が合わないんだけどって質問を受けたことが・・・。

・レプリケーションID型
 ・・・こんなのあったんだ。すいません、なんなのかわかりません。
使ったことないです。

・十進型
 私は数値はすべてこれを使います。例えば金額や数量、マスタのコード項目等ですね。業務系システムは何も考えずに十進型で良いと思います。過去の仕様を踏襲することも多いし。
 整数部と小数部をそれぞれ桁数で指定します。値の範囲が一般人にも直感的で分かり易いし、システムの仕様としても一目瞭然です。数値は基本的に十進型を使って良いと思います。
(ええ、処理効率は、整数型とか長整数型より劣ります。)
 だいたい金額なら9桁、数量なら7桁、金額集計項目は12桁で指定することが多いです。
 ACCESSの十進型は、他DBとの互換性を確保するために設けられたせいなのか(どうかはわかりませんが)、初期は結構不具合があった様です。今はACCESS2000でも、最新パッチの状態なら安定して使えると思います。

・日付/時刻型
 日付を扱うときは、日付/時刻型を使いましょう。1つの項目に時刻まで記録できるので便利です。が、日付/時刻型の仕組みについて、ちょっと知識があった方が良いかもしれません。
 COBOL好きの人は、日付を文字8桁で作りがちですが、もうそれは止めた方がいいと思います。どーせプログラム上では日付型変数に入れて扱うわけだし、日付用に準備された便利な関数を使うためには、日付型に変換してやらないといけないので。
 余談ですが、日付型のデータを日付型以外の物に取り出す場合(たとえばテキストボックスに表示とか)、かならずFORMATで書式を指定しましょう。たまーに、「地域のオプション」の日付形式をいじる人がいて、こちらが意図した内容にならないことがあるので。Where句の組み立てとかでこれを忘れると、大変なことになります。

・通貨型
 十進型以外で数値項目を定義するなら、二番手はこれかなと思います。通貨型にしておけば、大抵の用途では桁が足りなくなるような事が無いし、小数も4桁まで扱えます。
 MDBオンリーならお薦めしておきます。

・オートナンバー型
 テーブルにデータを追加していくと、自動で連番を振ってくれる便利な機能です。
が、自動であるが故に、番号を初期化したいとか、とんだ番号をなんとかしたいとか、そういうときに融通が利きません。後で困ります。なので使わないほうがいいです。はい。
 一応、最適化で初期化されるらしい。

・Yes/No型
 TrueまたはFalseまたはNullの状態を記録するのに使います。このデータ型もACCESS固有かな。Oracleにはありません。
 いわゆるフラグ的なデータを扱います。私はこっちより、十進型1桁を使います。(普段Oracleを使ってることが多いので、一緒の方がいい・・・)

・OLEオブジェクト型
 何でも放り込めるデータ型です。難しいのと、使う機会が無かったので、詳しくは知りません。

・ハイパーリンク型
 これも使った事無いです。

 かなり偏った主観だと思いますが、ここ数年はこの考え方で落ち着いてます。

 あと、項目名に日本語(かな漢字)を使うのはやめた方がいいと思います。まず、入力し辛い。そして、不具合・・・は、だいぶ無くなりましたが、それでもいろんな問題を引き起こす一要因になりやすいので、避けておいた方がいいです。ってね、ACCESSのサンプルや、ウィザードの例が日本語なんだな・・・。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。
※URL(リンク)は記述できません。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。