0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【PHP】データベースの型にdecimal(1,0)を使用する

Posted at

初めに

この記事は初学者を対象に書かれています

最近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型でやってきましたが、

これからはもっとスマートに型を決めていこうと決意しました。

参考になれば光栄です。

decimalについて参考にしたサイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?