背景
DB設計を担当する事が増えてきていて、 基本的なデータ型を考える基本すらないので調べてみました
理解したいこと
・データ型の基本情報 ・よく使う、テキストと数字はどちらを使えば良いのか?を基本に考える
よく利用するデータ型と制約に絞る
テキストと数字、制約ではインデックスを見ていく
・数字について
ChatGptにIntとBigintの使い分けについて質問し、 回答から判断すると、【2億以上か以下か】で判断して良さそう なので、大体のWebサービスでは、intで良いのではないかと思った
INT(整数型) INTは整数を保存するためのデータ型です。 通常、4バイト(32ビット)のストレージサイズを持ち、範囲は-2,147,483,648から2,147,483,647(または0から4,294,967,295)です。 BIGINT(大きな整数型) BIGINTはより大きな整数を保存するためのデータ型です。 通常、8バイト(64ビット)のストレージサイズを持ち、範囲は-9,223,372,036,854,775,808から9,223,372,036,854,775,807(または0から18,446,744,073,709,551,615)です。
・VarcharとText型について
ChatGptに質問してみた結果、 【文字数が予測できそうなもの】はVARCHAR 【予測できないもの】はTEXTが良いのではと 要するに、名称系は、VARCHARで、入力系はTEXTにするで良いのではないかと思いました笑
で、文字数の制限などをつけられるので、 VARCHAR(20) で、20文字の制限など
これはタイトルなどの文字数が100文字などつけると、 UIに大きく影響してくる可能性がると思うので要注意 文字数多くても、タイトル....などで実装しても良いかもね
VARCHAR(可変長文字列型) VARCHARは可変長の文字列を保存するためのデータ型です。 VARCHAR(n)の形式で定義され、nは文字列が保持できる最大文字数を指定します。 文字列はその長さに応じてストレージを消費しますが、最大n文字まで保存できます。 TEXT(テキスト型) TEXTは長い文字列を保存するためのデータ型です。 VARCHARよりもはるかに大きなサイズのテキストを保存することができます。 長さの制限がほとんどないため、非常に大きなテキストデータ(例:記事、書籍の内容)に適しています。 使い分ける基準 文字数が比較的少なく、最大長が予測可能な場合(例:名前、住所、メールアドレス)にはVARCHARを使用します。これにより、データベースのパフォーマンスを最適化し、ストレージスペースを節約できます。 文字数が非常に多く、予測が難しい場合(例:ユーザーが入力する大量のテキスト、ブログ投稿、コメントなど)にはTEXTを使用します。これにより、大量のテキストを柔軟に扱うことができます。 これらのデータ型の選択は、アプリケーションの要件、パフォーマンスの考慮、およびストレージの制約に基づいて行う必要があります。また、使用するデータベース管理システムによっても、これらのデータ型の具体的な特性や制限が異なる場合があるため、そのドキュメントを参照することも重要です。
・制約について
制約で一番わかりづらいのは、インデックスの利用だと思います
そこで、利用するかの判断は「カーディナリティ」らしい 理解に関しては下記の記事を参考にすると良いです
要は、インデックスは検索速度を上げるけど、 対象のデータによって効きが変わる では、どんなデータが良いのか?
それは「カーディナリティが高い」データ 例えば、日付など詳細は記事を見てほしい 図解してくれててわかりやすい
データ型の基本情報
下記のように種類があるらしい。ChatGptに聞いたら下記の様に回答がきた
数値型(Numeric Types)
文字型(Character Types)
CHAR(n)
:固定長文字列VARCHAR(n)
:可変長文字列TEXT
:長いテキストデータ
日付・時間型(Date and Time Types)
DATE
:日付TIME
:時間TIMESTAMP
:日付と時間DATETIME
:日付と時間(一部のDBMSで使用)
バイナリ型(Binary Types)
BINARY(n)
:固定長バイナリデータVARBINARY(n)
:可変長バイナリデータBLOB
:バイナリ大オブジェクト
論理型(Boolean Type)
BOOLEAN
:真偽値(TRUE/FALSE)
その他のデータ型
ENUM
:列挙型(指定された値のリストから選択)SET
:値のセット
メインの制約
NOT NULL
- このフィールドは空(NULL)にできないことを示します。
UNIQUE
- このフィールドのすべての値はユニーク(重複しない)でなければなりません。
PRIMARY KEY
- 各行を一意に識別するためのフィールド。通常、NOT NULLとUNIQUEの制約が自動的に適用されます。
FOREIGN KEY
- 他のテーブルの主キーを参照するフィールド。外部キー制約を使ってデータの整合性を保ちます。
CHECK
- 指定された条件を満たす必要があるフィールド(例:年齢は18歳以上)。
DEFAULT
- フィールドに値が指定されなかった場合に使用されるデフォルト値。
INDEX
- データベースの検索速度を向上させるために設定される。制約ではないが、データベース設計において重要。
これらのデータ型と制約は、データベース管理システム(DBMS)によって異なる場合があります。したがって、使用しているDBMSのドキュメントを参照して、利用可能なデータ型と制約の詳細を確認することが重要です。
まとめ
基本的なデータ型は何か?と、テキストと数字、基本的な制約を利用する判断軸を一様持てたと思う 後は現場で、挑戦して質問していけば、知識が上がってくるのではないかな?と思っています
ここまで読んでくれた方、ありがとうございます この記事を読んでいる方は、DB設計の経験が浅く、データ型をつける判断軸が全くなく四苦八苦している方なのではないかな? と思っています
DB設計ができるエンジニアは市場価値が高いと思うので一緒に頑張っていきましょう