- PR -

char型のプライマリキーとVarchar型のプライマリキー

1
投稿者投稿内容
初心
会議室デビュー日: 2004/06/23
投稿数: 15
投稿日時: 2006-12-22 14:00
いつもは意見させて頂いております。

少々、疑問に思ったもので皆様のご意見をお聞かせ頂きたいと思い、
投稿させて頂きました。

私が新人の頃は、データベースのプライマリキーに文字列を割当てる場合、
Char型を割当てるのが一般的だと先輩から教わりました。
現在では、プライマリキーに文字列を割当てる場合の多くがVarchar型を割当てています。
(私の周りのプロジェクトだけかもしれませんが・・・)
プライマリキーに対し文字列を割当てる場合、Char型、Varchar型で速度等の違いが出るのでしょうか?
また、OracleやSQL Server等のデータベースの種類によっても異なるのでしょうか?

私自身は、数値コードの0フォーマット等、フォーマットを割当てる場合は、
Char型を使用していますが、英字等の任意のコードを使用する際にはVarcharを
割当てるようにしています。
これは、顧客の要件によって変えています。

今更ながらの質問で大変申し訳ありません。
ご存知の方がいらっしゃいましたら情報をお願いします。
あまりにも基礎的な事(?)なので、情報が少なくてこれだと言う回答がありません。
よろしくお願い致します。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-12-22 14:47
引用:

初心さんの書き込み (2006-12-22 14:00) より:
(私の周りのプロジェクトだけかもしれませんが・・・)
プライマリキーに対し文字列を割当てる場合、Char型、Varchar型で速度等の違いが出るのでしょうか?


確かに若干CHARの方が早いときが多いでしょう。ですが、CHARもVARCHARも同じくらい遅いです。本当に速度が問題になるなら、数値型を割り当てます。

引用:

また、OracleやSQL Server等のデータベースの種類によっても異なるのでしょうか?


当然あるでしょうね。

引用:

私自身は、数値コードの0フォーマット等、フォーマットを割当てる場合は、
Char型を使用していますが、英字等の任意のコードを使用する際にはVarcharを
割当てるようにしています。


普通は、格納するのが英字か数字かで使い分けたりはしないでしょう。
CHARとVARCHARの違いは分かっているでしょうか?CHARは固定長文字列、VARCHARは可変長文字列です。CHAR(4)型のフィールドに'AB'と言う文字列を格納すると、'AB 'と言う文字列に拡張されます。再度読み出したときには、'AB 'に変化してしまいます。逆にVARCHAR(4)では'AB'のままになります。

また格納するのが数値であることが分かっているなら、文字列ではなく数値として格納するでしょう。'1'と'0001'と1の違いを意識しながらコーディングなんてしたくないですからね。
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-12-22 15:04
こんにちは。

SQL Server だと、サイズの小さなデータ型を使用するとページ分割が起こりにくくなる(ページロックによるパフォーマンスの低下を抑制できる)という点でchar型よりvarchar型の方が有利な場合があるはずです。
_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for VSTO (Jul 2008 - Jun 2009)
Hello Another World!
.NET 勉強会 / ヒーロー島
初心
会議室デビュー日: 2004/06/23
投稿数: 15
投稿日時: 2006-12-22 15:23
甕星様、ue様、回答ありがとうございます。

甕星様の仰るとおりですね。
私は、現在設計をする際には数値型のPKを作成し、ユニーク制約を付与したCDのような物(Varchar)で顧客の入力等を促しております。(マスタ系等)
この設計手法に反対意見もあると思いますが、ここでは議題に外れかねない為、説明は省かせて頂きます。

また、甕星様、ue様のお話しの通り、文字列型の速度は数値型に比べ遅いとは思っていましたが、
CharとVarchaの差異は意識するほどの物ではないのかもしれませんね。

本来であれば、教えて頂いた先輩に意図を聞くのが筋なのでしょうが、
その先輩は既に連絡が取れない状態になっている為、皆様のお知恵を拝借させて頂きました。
情報を頂きました皆様、本当にありがとうございました。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-12-22 16:05
RDBの実装によって内部のデータ型がtext/varchar/charで同じものもあったりします。
ですので速度を意識するのではなく、
データ型とキーの意味を意識して設計すべきでしょう。
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2007-01-07 00:27
MySQLや私が知っている国産RDBMSでは、固定長のデータ型だけで表を構成すると、
性能向上させることができます。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2007-01-07 13:10
この手の質問は良く見かけるけど、データのタイプより テーブル構造や索引の使われ方、結合条件などの要素の方がはるかに支配的なのでは?

1

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