初めに
この記事は初学者を対象に書かれています
最近Laravleの改修案件に参画しているのですが、
新しくテーブル、カラムを追加する機会があったので
その時に疑問に思ったこと、学んだことを共有します。
decimalとは
decimal
とは固定小数点数型のことで、記述方法か以下のようになります
decimal(M,D)
M ->桁数の合計 (精度)
D ->小数点以下の桁数 (スケール)
最大桁数 (M) は 65
デフォルトは 10
小数部の最大桁数 (D) は 30
デフォルトは 0
例えば、decimal(5,3)
の場合、
12.345
のように
5桁で小数点以下3桁の数字になります
データベース設計においての有効性
データベース設計において、データの型はとても重要です。
例えば以下のようなデータベース設計はどうでしょうか?
usersテーブル
Column | Type | Option |
---|---|---|
id | int | PK |
name | String | |
book_id | String | FK |
booksテーブル
Column | Type | Option |
---|---|---|
id | int | PK |
name | String |
このデータベース設計には一つの欠陥があります。
それは、FKのbook_idがString型であることです。
booksテーブルのidはint型で数値しか入らないのに、
それを参照するusersテーブルのbook_idはString型だと、
全角半角の違いなど、エラーや例外が発生しやすくなりデメリットしかありません。
それでは以下に直したらどうでしょうか?
usersテーブル
Column | Type | Option |
---|---|---|
id | int | PK |
name | String | |
book_id | int | FK |
booksテーブル
Column | Type | Option |
---|---|---|
id | int | PK |
name | String |
これで良さそうに見えますが、まだ改善点があります。
そう、decimalを使うのです。
usersテーブル
Column | Type | Option |
---|---|---|
id | int | PK |
name | String | |
book_id | decimal(3,0) | FK |
booksテーブル
Column | Type | Option |
---|---|---|
id | int | PK |
name | String |
int型だと9-10桁の整数を格納しますが、
整数 (INTEGER) 型は、9 桁または 10 桁の精度で、-2,147,483,647 から 2,147,483,647 の範囲の整数を格納します。
decimal(3,0)だと3桁の整数までしか格納できません。
「ユーザーが持つ本の数が4桁もいかないだろう」
という時はこのように最小の型で定義してあげましょう。
DBの設計の基本の1つとして、膨大に容量が膨れやすいDBの設計は、中に何が入るのか、どのぐらいのデータになるのか予測して、その最小の型で定義していくものです。
そうしないと、サーバーの容量を食う上に読込速度も遅くなるといった無駄なことが増えるためです。
例えば1件のデータを追加するだけで定義したカラム分容量を食うので
これが数万、数千万となると適当に定義すると必要な容量が2倍、3倍と増えてサーバーのストレージのお金もかかります
まとめ
今までは「動けばいいや」とずっとint型でやってきましたが、
これからはもっとスマートに型を決めていこうと決意しました。
参考になれば光栄です。