🍉

DB設計 テーブル定義書・SQL

2023/05/12に公開

はじめに

チーム開発でDB設計中の初心者です🔰
今日はテーブル定義書を作成しました。

それぞれの制約やデータ型について調べてみました。
INDEXについては結局どこにつけたらいいのかは曖昧な感じですが、基準はなんとなくわかったかな🤔

情報が多すぎてほんの一部分ですが、
後で時間があれば本など読んで勉強しようと思います🥲

https://www.amazon.co.jp/dp/4295013390/

テーブル定義書

テーブル定義書は、テーブルやカラムの定義や制約を定める設計書のこと。
Railsではmigrationファイルの材料となる、非常に重要なドキュメント!

テーブル名は全て複数形にすること📝

各制約

  • PK(主キー)
  • FK(外部キー)
  • データ型
  • NOT NULL
  • AUTO INCREMENT
  • INDEX
  • DEFAULT

(enum = 名前を整数の定数に割り当てるのに使われる / 型はintegerで記述)
https://pikawaka.com/rails/enum

PRIMARY KEY(主キー)

  • テーブル内の1つの行を一意に特定できるカラムのこと。
  • 重複したデータを入力しようとするとエラーとなる。
  • 必ずデータが格納されている必要があるため、NULLを挿入することはできない。
  • 表に一つのみ定義できる。

FOREIGN KEY

  • 外部キー制約は、テーブル間のカラム同士を関連付け、データの整合性を保つために設定。
  • NULL値を含めることは可能。
  • 「UNIQUE制約」、「PRIMARY KEY制約」が定義されている列しか定義できない。
  • FOREIGN KEY制約を定義すると、親表は削除できない。

NOT NULL(空欄を禁止)

必ず何かを入力してほしいカラムに設定。
NOT NULL制約がかかっているカラムに、NULL(何も入っていない状態)のまま登録や更新しようとすると、エラーになります!

AUTOINCREMENT(自動的に連番を割り振る)

設定したカラムに自動的に番号を割り当てる機能。
Railsでモデルを作成すると、自動的に「id」カラムが作成され、レコードを追加するたびに1ずつ追加されていくが、これは、idカラムにAUTOINCREMENTが設定されているため。

INDEX

検索機能に優れていて、簡単にデータを抽出することができる。
名前の通り、本などの索引をイメージするとわかりやすい💡

🌱わかりやすい記事
https://qiita.com/kodai-saito/items/541e4fe46c2d3edc9634

DB内にINDEX設定したものだけでサブテーブルを作成。
INDEXに入っているデータは元の各カラムの住所を持っているから、すぐにデータを見つけることができるようになる!

インデックスがないと、いくらDBが検索機能に優れているとはいえ、
システムによっては、1万件〜などの膨大なデータを順番に探さないといけないので速度的な問題が発生する。

システム導入初期の時は問題がなくても(データが少ないため)
数年後データが膨大になった時に問題が発生することがある!

システム開発では、設計段階でどのくらいのデータがデータベースの各テーブルに登録されるのかを想定
必要に応じて、テーブルのカラムにインデックスの設定をすることが大切

最初の段階ではそこまで入れなくも、実装しつつDBの速度を見ながら足していけばOKらしいです。
入れすぎるのもDBにとって負担になってしまうそう。

https://qiita.com/suzukito/items/ca6a19fc7c6dec35b302

DEFAULT(初期値を指定)

  • この制約でカラムの初期値を設定することが可能。
  • DEFAULT制約を設定しない場合の初期値はNULLになる。

UNIQUE(重複を禁止)

  • 他の行のカラムに同じデータが存在する場合、データ登録を行えないようにする制約。
  • 例)emailや電話番号など
  • PRIMARY KEY(主キー)と違い、NULL入れることが可能。(NULL値は重複可能)

代表的なデータ型

データ型を使い分け、指定することで、データベースに制限をかけられる。
そのカラムには、指定した条件以外のデータを入れることができなくなる!

データ型 種類
integer 数値(整数)
decimal 数値(精度の高い小数)
float 数値(浮動小数)
string 文字(短い文字列)
text 文字(長い文字列)
date 日付
datetime 日時
time 時刻
timestamp タイムスタンプ
binary バイナリ
boolean 真偽(trueかfalseかしか入らない)

https://tech.pjin.jp/blog/2020/10/30/【sql入門】制約の種類/

読んでおいた方がいい命名規則

https://qiita.com/genzouw/items/35022fa96c120e67c637
リーダブルコードについても勉強しないとですね🧐

SQLについて

この流れでSQLについて少し学んでみました。

Structured Query Languageの略(構造化問い合わせ言語)
SQLとはデータベースを操作する【データベース言語】。

SQLで何ができる?

  • データの保管、取得、更新、削除🌟
  • テーブルの作成、更新、削除
  • アプリ開発時にデータベースを操作できる
  • データ分析してビジネス活動を改善

💡_φ(・_・
Railsでは、Rails標準のライブラリであるActive Recordを利用して、Modelを実装します。
つまり、Railsでは、Active Recordを使って、データベース(テーブル)にデータを格納したり更新したり、データベース(テーブル)に格納したデータを検索したりできるということです。

Active Recordを使うことで、SQLを直に実行する必要はほぼなくなります。
Active Recordは、ユーザーに代わってデータベースにクエリを発行していて、発行されるクエリは多くのデータベースシステム(MySQL、MariaDB、PostgreSQL、SQLiteなど)と互換性があります。
Active Recordを使えば、利用しているデータベースシステムの種類にかかわらず同じ記法を使えます。
💡

今まではSQLについてそこまで意識してきませんでしたが、
メソッドを使った時にどんなSQL文が発行されているのか?は随時目視して確認していきたい!🤔

🌱わかりやすい記事
https://railsguides.jp/active_record_querying.html

🌱参考にさせていただいた記事

https://udemy.benesse.co.jp/development/system/intro-sql.html
https://www.makeshop.jp/main/know-how/knowledge/sql.html
https://zenn.dev/akhmgc/articles/037777478e8d1b

🎥動画
https://www.youtube.com/watch?v=v-Mb2voyTbc&t=417s&ab_channel=だれでもエンジニア%2F山浦清透

Discussion