過去の桐井戸端BBS (桐ver.9)
25178 主キーのデータ型は文字列型がよく使われていますがカウンタ型や数値型に比べてどのようなメリットがありますか ジョイフル@信州 2004/02/28-23:26
ご無沙汰しています

主キーのデータ型について教えてください。
今まで主キーについては、カウンタ型や整数などを項目にして、重複禁止設定をしてきました。
しかし、オラクルなどSQLデータベースでは、よく文字列のデータ型が、主キーに使われていることが、多くあります。

0001
0100
1000

桁数をあわす意味では、見やすいのですが、カウンタ型や、数字に比べてどのようなメリットがあるのでしょうか?
また、並び替えの特性も、スピードとか重複禁止について、何かメリットがあるのでしょうか?
教えてください。

25180 Re:答えではありませんが HERB 2004/02/29-11:13
記事番号25178へのコメント
ジョイフル@信州さんHERBです。

答えにはなりませんが思いついたことを。

>主キーのデータ型について教えてください。
>今まで主キーについては、カウンタ型や整数などを項目にして、重複禁止設定をし
>てきました。
>しかし、オラクルなどSQLデータベースでは、よく文字列のデータ型が、主キー
>に使われていることが、多くあります。
中略
>教えてください。

オラクルはさわったことがないのでわかりませんがSQLを桐に読み込む定義画面で見ると
主キーを複数指定できるようですね、おそらくどういったクエリーを作成するかによって主キーを決めているのでは?

データベースの設計でどの項目に、データ型、計算式を作成するか、
その表から求める値をできるだけ効率よくクエリー表、
桐で言う結合表を作成するかによって文字列型項目も
主キーとする必要性があるのではなかろうかと。

桐の場合、並び替え、併合を効率よく行うために索引がありますね。

そういった総合的に効率をよくするために主キーの設定を行う?

思うところを書いてみました、間違っていたら皆さんフォローよろしくお願いします。

25186 Re:主キーのデータ型 佐田 守弘 2004/02/29-23:32
記事番号25178へのコメント
ジョイフル@信州さん
私は本格的な大型DBに詳しいわけではないので、あくまでも桐の世界での話として受け止めて下さい。

●前置き
まず先に述べておきますと、MS-DOS版の桐には主キーという概念はありませんでした。
また、かつてのdBASEでもdBASE-IIIまでは主キーの概念がなかったと思います。
しかし、桐ver.5が隆盛だった頃には、大型のDBには既に主キーの概念が一般的だったのではないかと思います。

確認しているわけではありませんが、人から聞いた話を総合すると、
カウンタ型の概念が登場したのは、Accessが最初ではないかと思います。
(既にSQLサーバにもあったのかどうかは知りません。)

しかしデータベースはそれ以前からもあったわけで、リレーションを取るためには、
主キーないしは同等の機能の項目を持たせる必要はあったはずです。
かつての事務系の言語であるCOBOLも、データベース処理は行っていたと思いますが、
当時は仮に数字であっても、文字列として扱っていた可能性はあろうかと思います。
そしてその流れというか流儀で、その後のDBでも、文字列型で主キー項目を作った事は想像できそうです。

また当時は、各種のコード番号をどの様に振るかといった事が話題になると、
「先頭に品種分類のアルファベットを1文字、続く2桁が中分類、末尾3桁が...」
などと議論していた話もありますから、おそらくカウンタ型の様な自動発生値ではなくて、
桁に意味を持たせた文字列で主キーを作るのが普通だった時代もあったろうと想像します。

●主キーとして適したデータ型
主キー項目として必要充分な条件は、重複しないユニークな値を持たせ得る事に尽きると思います。
この条件さえ満たせば、特にデータ型を問うものではありません。

しかし「どの様なデータ型が効率的か?」の点では、考える必要はあると思います。
1)値のユニーク性の保証
この点では、自動生成するカウンタ値に一朝の利があろうかと思います。
カウンタ値でなくても、例えば重複禁止による索引で、それを保証できれば同じ機能になります。

2)処理速度
処理速度は、データ長が最も影響すると思います。
桐の世界で言えば、整数型が2バイトで最もデータ長が短くなります。
もし、整数型で間に合う範囲であれば、多分速度的には最も効率的であろうと思います。

一方、カウンタ型は長整数型と同じ4バイト型です。
仮に文字列型で2文字とすれば、同じ4バイトですから、多分処理速度はあまり変わらないだろうと思います。
しかし、2文字の文字列で表現できる値には、どうしても限界があります。
結果として多数の文字数を使ってしまうと、その分だけ処理速度が下がるであろうと思います。

桐の場合、英数字でも2バイトで処理しますから、検索や並べ替えの点では、
データ長が長い分、不利ではないかと想像します。

そう言った意味で言うと、無味乾燥な連番号ではありますが、カウンタ型には、それなりの利点があるのかと考えます。

佐田守弘(KS-00119)
25190 Re:主キーのデータ型 hidetake 2004/03/01-07:53
記事番号25178へのコメント
主キーが数値型(カウンタ型も含む)か文字列型かと言うと
色々な面で数値型の方が効率が良いのでは無いですか?
インデクスのサイズでも結構な違いが出てくるような気もします。

>0001
>0100
>1000

こちらの表現に関しては内部の型がどうであろうと,
通常の場合,書式設定で設定するだけで済む場合が多いと思うので,
できれば数値型の方が良いように思います。

ただ,桐はこのような書式設定ができないので,おのずと
文字列型にせざるを得ません。

だから 100 と 0100 の違いを考慮したり(比較等で),
入力の際の禁止設定を行ったり面倒な面が出てくると思います。

それに書式設定で済めば 0100 と入力をさせなくても 100と入力するだけで済むので
入力の軽減にもなると思います。
(手入力をさせる場合)


# 桐でも書式設定が欲しい! ねぇ〜,たゆーさん (^^;


25196 Re:主キーのデータ型 ジョイフル@信州 2004/03/01-12:58
記事番号25186へのコメント
佐田先生ありがとうございます
>2)処理速度
>桐の場合、英数字でも2バイトで処理しますから、検索や並べ替えの点では、
>データ長が長い分、不利ではないかと想像します。

それは知りませんでした(^^;
今回のケースの場合、業務でお世話になっているシステム会社の話では、文字列のほうが、検索「速度が速い」という説明がありました。

また、実際に使いたいデータは、カウンタのように連続した数値ではなく、任意に指定された数字となります

>佐田守弘(KS-00119)

25197 Re:主キーのデータ型 ジョイフル@信州 2004/03/01-13:05
記事番号25190へのコメント
>それに書式設定で済めば 0100 と入力をさせなくても 100
>と入力するだけで済むので入力の軽減にもなると思います。
>(手入力をさせる場合)
># 桐でも書式設定が欲しい! ねぇ〜,たゆーさん (^^;

書式設定という機能は、アクセスでしょうか?
あると便利ですね!
実際にサンプルデータで実験をして見ましたが、文字列にした場合、必ず桁を揃えておかなければ、ならないと思います。
010
10
030
30
では、並び順が、思いどおりにならないケースが、ほとんどだと思います。

数字の場合、番号の絞込みで、200から299までの番号を絞り込むとき、
200=<[]<300
でいいと思うのですが、文字列のような場合はどうしたらいいのでしょうか?




25198 Re:主キーのデータ型 hidetake 2004/03/01-13:23
記事番号25197へのコメント
>書式設定という機能は、アクセスでしょうか?

無いのが珍しいのでは無いでしょうか?
Access や Excel だって,もちろん DBPro だってあります。

数値書式
http://www.softvision.co.jp/dbpro/help/guide/format.htm#number

他の Perl や PHP だって書式関数はあるわけだし,PsogreSQL
でも書式を設定してデータを取り出す事も可能です。だから
表示上や印刷はそんな機能を使えばよいだけだと思います。
桐のようなデスクトップデータベースはデータと出力が一体化しているので,
その項目なりオブジェクトに書式設定があれば
処理が非常に簡素化できると思いますが,それができないので
敢えて面倒な文字列を使う必要が出てきたりして

>実際にサンプルデータで実験をして見ましたが、文字列にした場合、必ず桁を揃え
>ておかなければ、ならないと思います。
>010
>10
>030
>30
>では、並び順が、思いどおりにならないケースが、ほとんどだと思います。

このような事を考慮したり,処理を行わなければならなくなり
面倒が増えると思いますけど?


>数字の場合、番号の絞込みで、200から299までの番号を絞り込むとき、
>200=<[]<300
>でいいと思うのですが、文字列のような場合はどうしたらいいのでしょうか?

前ゼロをどう考慮するかによって変わりますが
" " で括ってそのまま条件判断させるか,#数値で数値化して判断させる
かでは無いでしょうか?

25206 Re:主キーのデータ型 野良犬 2004/03/01-23:56
記事番号25178へのコメント
こんばんは

>しかし、オラクルなどSQLデータベースでは、よく文字列のデータ型が、主キー
>に使われていることが、多くあります。
それはいくぶん誤解があるのではないでしょうか。
オラクル等のRDBMSでは、複数の項目からなる主キーを定義する場合がおおくなり、
先のような文字列の主キーは一部のマスターに限られると思います。
昔の(RDBMS以前の)技術者が絡んだシステムでは、
そのような文字列のキーが多い傾向にある気がします。

>桁数をあわす意味では、見やすいのですが、カウンタ型や、数字に比べてどのよう
>なメリットがあるのでしょうか?
メリットはほとんどありません。ただ、
コード自体に意味を持たせるようなコード体系の場合、
そうするしかない場合があります。

速度面
 一般的なRDBMSの場合、CHAR(4)とINT を比べると、文字セット等を考慮しない環境ではほぼ同じになります。
 桐の場合、文字列はすべて可変長になるので、長整数型のほうが圧倒的に有利ですね。


25209 Re:主キーのデータ型 ジョイフル@信州 2004/03/02-07:03
記事番号25206へのコメント
>昔の(RDBMS以前の)技術者が絡んだシステムでは、
>そのような文字列のキーが多い傾向にある気がします。

なるほど!
昔の設計思想のまま、そのままきていると思います

>速度面
> 一般的なRDBMSの場合、CHAR(4)とINT を比べると、文字セッ
>ト等を考慮しない環境ではほぼ同じになります。
> 桐の場合、文字列はすべて可変長になるので、
>長整数型のほうが圧倒的に有利ですね。

桐の場合は、これからは長整数型で行いたいと思います
いろいろありがとうございました

戻る