- PR -

主キーの型について(varchar?or char?)

投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2007/05/01
投稿数: 35
投稿日時: 2007-09-01 15:59
主キーの型について質問があります。

主キーの型をvarcharにするか、charにするかで
何か決定的な違いはありますでしょうか?(Oracleの場合)

charの場合は、桁が不足した文字をDBに格納する際、後ろにスペースが付加されますが、varcharの場合は、そうではありません。
それゆえ、
・charは断片化が発生しにくい。
・varcharはDBブロック占有領域が小さい
・ABCとABC__に異なる意味を持たせたい場合、
 vahrcharは可能であるが、charは不可能。

などが考えられますかね!?(間違っていれば指摘願います。)

型の違いによる、決定的なメリット、デメリットがあれば
ご教授お願いいたします。






こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2007-09-01 16:14
速度に関して、10バイト以下程度の小さいサイズであればどちらの型も大差無いはずです。

格納するデータ長が大きくなる場合は、そのvarchar項目を主キーに選択するよりも、
よりキー候補として適切なカラムを選択すべきだと思います。

引用:

ABCとABC__に異なる意味を持たせたい場合、



__ってスペースのことですよね?
経験上、varchar項目の右余白は見つけにくい不具合になることがあります。
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2007-09-02 00:10
「varcharはDBブロック占有領域が小さい」は違うんじゃないかな?
varcharは内部的には「長さを示す領域+定義されたときの最大の長さ」の固定長です。
だから厳密にはバッファやキャッシュのページに収まるレコード数はcharより少なくなり、
物理媒体上ではcharより余計に領域を使用します。

「charは断片化が発生しにくい。」の断片化は物理媒体上のフラグメンテーションのことでしょうか?だとしたらフラグメンテーションはレコード単位で起きるのでcharとvarcharは関係ありません。

主観ですが、いまどきのコンピュータでは主キーの型がvarcharでもcharでも体感できる差はでないと思います。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2007-09-03 11:58
引用:

Java僧さんの書き込み (2007-09-02 00:10) より:
varcharは内部的には「長さを示す領域+定義されたときの最大の長さ」の固定長です。


varchar(varchar2)は本当に可変長ですよ。
そして、charも「長さを示す領域」を持っています。
ここらへんはブロックダンプ取れば良く分かります。

あとcharも、NULLのときだけは「NULLフラグ」が立つだけなので、完全にいつも固定長というわけではないです。今回は主キーなのでNULLは入りませんが。
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2007-09-03 12:07
Oracleのアーキテクチャをよく知らずに書きました。
混乱させて申し訳なかったです。
deanna
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 118
投稿日時: 2007-10-02 13:26
「主キーの型をcharにするかvarcharにするか」ではなく、
主キーの業務上の属性がなんなのかが問題なのでしょう。
それを無視してcharかvarcharかの議論はちょっと難があるのでは。
未記入
常連さん
会議室デビュー日: 2007/05/01
投稿数: 35
投稿日時: 2007-10-02 17:03
確かに業務用件を無視して、主キーの型を議論することに
無理があるかもしれません。

とはいえ、業務用件の考慮の前に、
キーの型にcharとvarcharのどちらを採用するかの最低限の指針は
必要かと思われます。

そこで私は、以下のように理解しました。

charとvarcharによる性能的な差異はほとんどない。
しかし、主キーの型にvarcharを採用した場合、
ABCとABC_(_はスペース)が別レコードとしてDBに格納される。
つまり、スペース自体が意味をもつことになる。

APバグの潜在を避けるという観点から、
主キーのコード設計上はcharを前提に進めることが、ベターである。

どうでしょう?

flatline
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 102
投稿日時: 2007-10-02 17:39
単なる好奇心ですが、数値型という選択肢はないのでしょうか?
私はいつも数値型(oracle ならnumber型) にしてますが。

スキルアップ/キャリアアップ(JOB@IT)