close
プログラミング クラウド Microsoft Azure 情報処理資格 基本情報技術者 IT基礎 応用情報技術者 開発・設計方法 オブジェクト指向 内定者・新人研修 プログラミング基礎 アルゴリズム コンピュータ数学 内定者研修 新人研修 ヒューマンスキル プロジェクトマネジメント プレゼンテーション リーダーシップ 組織マネジメント ネゴシエーション ロジカルシンキング Java UI/UX HTTP JavaScript基礎 情報処理資格 ネットワークスペシャリスト ネットワーク インターネットルーティング応用 IPアドレス データベース応用 SQL応用 パフォーマンスチューニング データベース設計 ER図 概念設計(データベース) 論理設計(データベース) IT資格 Linux基礎 OS・システム基盤 セキュリティ TCP/IP OSI参照モデル データベースセキュリティ ファイアウォール 標的型攻撃 SQLインジェクション ネットワーク基本設計 CCNA Cisco プロジェクトマネジメント資格 情報処理資格プロジェクトマネージャ 情報処理安全確保支援士 人事給与 財務会計 管理会計 簿記 生産管理 在庫管理 ERP バランススコアカード 情報処理資格 ITアーキテクト 情報処理資格 ITストラテジスト 情報処理資格 ITサービスマネジメント 情報処理資格 システム監査 PMBOK® PMP® プロジェクト計画 WBS リスクコントロール ITIL ITサービスマネジメント 要求定義 要件定義 見積手法 ビジネスインダストリ 業種・業界知識 業務知識 提案力 ソフトウェアテスト基礎 情報処理資格 データベーススペシャリスト ハードウェア基礎 外部設計(基本設計) 内部設計(詳細設計) データベース基礎 SQL基礎 RDBMS 物理設計(データベース) C++ Ruby MVC基礎 Webアプリケーション開発 JavaEE Javaプログラミング応用 フレームワーク MVC応用 Spring フレームワーク ソフトウェアテスト応用 テスト手法 Junit スマートフォンアプリ開発 Androidアプリ開発 C# 基礎 C# 応用 負荷テスト Javaプログラミング基礎 ソフトウェアテスト コーチング メンタリング HTML/CSS サーバー構築 仮想化技術 KVS (NoSQL) アジャイル スクラム ファシリテーション C言語 ITパスポート JSTQB データサイエンス 単体テスト ユニットテスト キャリアアップ インターネットルーティング基礎 パケット解析 LAN構築 データベース データサイエンティスト トレンド 障害対応 インフラ監視 HTTP/2.0 コンピュータサイエンス VPN ネットワーク物理設計 データベース障害 JavaScript モダンJS (Modern JavaScript) 応用 MVS応用 バックアップ/リカバリ 分散処理 Hadoop Hive Python AI 深層学習(DeepLearning) CentOS Linux応用 Zabbix シェルスクリプト Infrastructure as Code Windowsサーバー基礎 内部設計 Docker DevOps Windowsサーバー応用 NginX chef Ainsible ロジカルライティング R テスト自動化 Jenkins Git 継続的インテグレーション (CI) バージョン管理 Vagrant 要求分析 Redmine 継続的インテグレーション(CI) 継続的デリバリー (CD) ヒューマンリソース管理 Web API マイクロサービス コミュニケーション 業務知識/業界知識 マーケティング 語学 AWS 法務 IoT ビジネスマナー OJT 業務効率化 表計算ソフト オフィスソフト コンプライアンス フロントエンド Subversion PHP 関数型プログラミング Laravel モダンJS (Modern JavaScript) 基礎 Android Studio 機械学習 iOSアプリ開発 ぷプログラミング React 次世代高度IT人材 共創 IPA Raspberry Pi Xamarin スクリプト言語 GoF CUI VBA 資格 ビジネス文書 jQuery 研修参加レポート マネジメント OSPF テーブル設計 アンガーマネジメント クリティカル・シンキング PDU 経営改善 Pマーク 問題解決技法 サイバー攻撃 エンジニア 参加してみた エンゲージメントマネジメント 労働関連法 新人育成 ネットワーク構築 情報セキュリティマネジメント デザインパターン リファクタリング マルチスレッドプログラミング ベンダーコントロール Modern JavaScript 冗長化 VLAN インフラエンジニア チームビルディング テストケース リーダブルコード セキュリティ入門 ネットワーク入門 Node.js npm gulp ビルドツール Python入門 冗長化入門 インフラ実機演習 プロジェクト管理 Active Directory ネットワーク管理 コンテナ 正規化理論

作って学ぶはじめてのテーブル設計 に参加してみた

今回の研修参加レポートは↓です。

作って学ぶはじめてのテーブル設計

データベース設計というと、正規化ガガー、モデルを書いてー、と敷居が高く感じられますが、坂井さんらしいとても馴染みやすい言葉で設計のステップを解説いただけました!

またよくある、論理設計/概念設計といったフェーズで分けた解説ではなく、テーブルというなじみのある題材にしたことも、直感的に学べたように思います。

これからアプリケーションエンジニアとしてDB設計をはじめようという方には、進め方やスキルの鍛え方がわかる内容になっています!

では、どんな内容だったのかレポートします!

 

想定する受講者

  • 簡単なSQLの知識(主に JOINを含むSELECT操作など)

 

受講目標

  • テーブル設計についての基本的な考え方と感覚を身につける。

 

講師紹介

講師は以前にレポートした「データベース超入門」でも登壇された 坂井 恵 さんです。

はじめてでも本質を理解できる! データベース超入門 研修コースに参加してみた

「笑顔にしたい」という思いが、こういった研修コースにも表れていますね。

 

今日の目標

  • データベースとは何かを、もっかい復習
  • テーブル設計ってどうやって進めるの?
  • 様々なケースで体験してみましょう

 

テーブル設計ってなに?

 

つまり正解がないため、10人いれば10通りの設計が出来てしまいます。
例えば、原理主義と現実主義の食い違いなどはよく起こりがちです。

なので、なぜこの設計にしたのか、というのを説明できるように、自分で考えることが重要です。

 

 

RDBMS上に 要件 を実現できるテーブルを作る、ということがテーブル設計の目的です。
ということは、この要件をしっかりと把握するということが、まず必要です。

なので要件が変われば、もちろんテーブルも変わります。

要件、つまり現実世界のルールはこのコースでは扱わないけど、とても密接なので、勉強しましょう。
坂井さんもはじめての業務・業種をやるときは、漫画のような本、教科書のような本、わかりやすい本の3冊は読んでいるとのことでした。

 

RDBMSの復習

 

前回「データベース超入門」でも出てきたスキル一覧ですが、テーブル設計をするには↓の2つが必要です。

 

  •  SQLは必須
  •  (1テーブル何億レコードといった大規模なシステムを扱う場合は) パフォーマンス

 

特にSQLが重要で、このあと講義で身をもって知ることになりました。

また補足として、このすべての知識を理解できれば、トラブル対応が出来るようになるとのことでした。
確かにトラブル発生時に症状やログから何が起こっていて、どう切り分けて、どう復旧するのか、判断のスピードと正確さが求められるので、すべての知識が必要ですね。

 

テーブル設計の目的

 

「つかいやすい」を明確に定義されたので、わかりやすく、またSQLが分かってないと出来ないことが多いことに気付けました。

当たり前ですが、出来上がったデーブルをもとにSQLで操作するので、データの取り出しやすさや更新のしやすさ、またパフォーマンスもクエリによっては時間がかかってしまうので、SQLを十分に知らずして、テーブル設計は出来ないというのが理解できます。

また、テーブルを作っているうちに正解が無いために迷ったり悩んだりするので、まず「データが壊れない」というRDBMSの原点に立ち返ると良いとのアドバイスも頂きました。

 

どうやって設計するのか

どのようなテーブルを作るべきなのか理解したところで、設計の進め方を解説していただきました。

 

 

情報を整理する「洗い出す」

 

  • ユーザーが考える要件は漏れるので、想像力は重要
  • 何を洗い出すのか
    • 注文内容 のような大きなデータのカタマリ。商品マスタなどは後で考える
    • どういうシーンで使われるデータなのか考える ex.  ‘商品検索’   ‘注文確認’
  • 100%の完成度は目指さず、ユーザーに何回も確認しながら進めることが重要

 

洗い出した情報を「整理する」

 

  • データのカタマリに名前をつけて、おおざっぱに型を考えておく
  • 文字列なのか数字なのか日付なのか、その他
  • ここでも厳密に使用するRDBMSを意識せず、あくまで大雑把に整理する

 

テーブルのイメージができたら「シミュレーションする」

 

  • 実際に書くSQLをイメージして、追加、更新、削除、検索で考えてみる

 

テーブルを作りながら「ブラッシュアップする」

 

  • パフォーマンスを検討する
  • データ件数や増加率がどれぐらいか
  • 更新頻度はどれぐらいか

 

実際にテーブル設計を体験してみよう

設計の進め方がわかったところで、ゼロからどのようにテーブル設計を考えるのか、通販システム を例に進めます。

また、予め坂井さんが用意した SUMO(相撲力士データベース) もとにSQL操作して、必要なSQL操作や現状の設計の問題点を考えます。

 

必要なSQLの基礎知識を確認

 

用意いただいた SUMO のデータベースをもとに、幾つかのテーブルを結合する JOIN をやってみました。

なぜ JOIN からやったのかというと、テーブル設計ではテーブルを分割することが多く、それをどう分割前に戻すのか必要だからです。

また、ここでググってやるのでは遅く、テーブルを見たらスグに実行できるほどにSQLに習熟している必要があるとのことでした。なお、私はググってQiitaを見ていました。。 まだ設計レベルにありません。

 

通販システム を題材にテーブル設計する

 

洗い出す

 

ざっと登場するものを 大きく 考えることがポイントです。
洗い出しのコツは、

 

  • アウトプットに注目する
    • 帳票や画面を見る
  • ユーザーがいるならどんどん聞いたほうがよい

 

その上で、洗い出したテーブルをザッと書いてみます。(それが上のスライドです)

 

整理する

洗い出したテーブルをもとに、問題点を考えて、テーブルを分割します。また、そのテーブルに名前をつけ、カラムの型をざっくり決めます。

 

このテーブルの問題を考えながら、解決していきます。

 

  1. (問題) 注文テーブルをみると、1回の注文で1個しか注文できない
  2. (解決) 注文番号を複数にして、商品を注文できるようにする
  3. (問題) 複数の注文番号に対して、送付先住所が2つある
  4. (解決) 注文テーブルを 注文ヘッダ注文明細 でテーブルを分けてみる

 

このように実際のデータを想定して、整理を繰り返します。

 

 

この整理の段階で、テーブル名をつけるのですが、その注意点も教えてもらいました。

 

  • RDBMSは海外製がほとんどマルチバイト文字に対応していない
    • とはいえ、いまRDBMSでマルチバイト対応が進んでいて、 emoji が使われるようになって復権している
    • - (ハイフン) はマイナスと判断されちゃうのでダメ
  • ホモニム: 同じものには同じ名前をつけるんだよ
    • 商品 items というテーブルを作ったら、他のテーブルで商品のカラムを使うときに product とか使わない
  • シノニム: 複数のテーブルには同じカラム名はつけない
    • 商品と顧客というテーブルを考えたときに、 name というカラムを双方のテーブルにあるとややこしい
    • client_name とか product_name とかにしよう

 

ちなみに、エンジニアに聞くと、WebアプリケーションフレームワークのORマッパーでもお作法があるので、この注意点がハマらないときもあるそうです。

 

シミュレーション and ブラッシュアップする

実際に作ったテーブルをもとに、シミュレーションとブラッシュアップを繰り返します。

 

また忘れがちなポイントとして ↓ を注意点として挙げていただきました。

 

  • 時間の流れがあるデータもある
    • 例えば、150円の商品が160円に変わった場合、過去の注文明細が変わってしまう
  • NULL は慎重に扱うようにする
    • JOINしたときに NULL があると予期せぬ結果を招くことがある

 

null は難しいポイントですね。

現実世界では入力フォームの全項目にユーザーが入力する、ということは難しいので、とっても工夫をしないと大変です。

 

テーブル設計の経験数を増やすコツ

最後に、テーブル設計は経験によってスキルが磨かれるので、その経験数を増やすコツを教えてもらいました。

 

  • いろいろなレシートや伝票から設計する
    • 実はコンビニエンスストアごとに出力項目が違う
    • ドラッグストアとコンビニエンスストアでも、もちろん項目が違う

 

普段の生活の中で、とっても馴染みやすい思考訓練ですね。

最後に、実際に坂井さんが最近経験された失敗事例を教えてもらいました。

その失敗とは、設計そのものではなく、要件を真に受けすぎ、100回やって1回ぐらいしか検索しない要件をそのまま実装してしまい、パフォーマンスが落ちてしまったそうです。
坂井さんでもお客様の要件を理解する、ということは難しいものなので、とにかく要件を想像する、確認するというのは重要なことなのですね。

 

まとめ

テーブル設計とは何を目的に、どのように進めるのか、サンプルのシステムをもとに演習して理解しました。

モデルや正規化といった言葉は使わず、テーブルという馴染みのあるもので、データベース設計を学びました。

また設計の進め方も、「洗い出す」「整理する」など、とてもわかりやすい言葉で表現されていたので、どう進めるのか、とてもイメージしやすくなりました。

私自身、まだまだSQL操作に慣れる必要があるので、まずこれからですが、普段の生活でもレシートを見るということでも鍛えていきたいと思います。

データベース設計やアプリケーション設計にこれから携わるという方には、必要なスキルや見通しがとても良くなるのでオススメです!

 


SEカレッジが気になった方はこちらからお気軽にお問合わせ下さい!

お問い合わせフォーム

SEカレッジの詳細をご覧になりたい方はこちら!!

SEカレッジ

特集・キャンペーン

よくある質問集

タグ一覧

研修参加レポート参加してみたJava基本情報技術者プログラミングセキュリティプログラミング基礎コミュニケーションLinux基礎オブジェクト指向プロジェクトマネジメントアルゴリズム情報処理資格PythonエンジニアJavaプログラミング基礎SQL基礎Javaプログラミング応用新人研修コーチングSQL応用IoTファイアウォールビジネス文書Raspberry Piマネジメントデザインパターンロジカルシンキングテーブル設計JavaScript新人育成トレンドUI/UXC# 基礎単体テストSQLインジェクションデータベース設計JavaScript基礎jQueryCCNAデータベース基礎ネットワークITILDocker内定者研修冗長化ソフトウェアテストVLANRDBMSOSPFリファクタリング要求定義テスト自動化データサイエンスインフラエンジニアZabbixマルチスレッドプログラミングビジネスマナーシェルスクリプトアンガーマネジメントネットワーク構築障害対応プレゼンテーションIPAWebアプリケーション開発アジャイルModern JavaScriptAI表計算ソフトLAN構築JavaEE経営改善関数型プログラミングVPNエンゲージメントマネジメントデータベースロジカルライティングGoFPマークLinux応用データベース障害資格問題解決技法物理設計(データベース)要件定義Node.jsWBSサイバー攻撃チームビルディング共創MVC基礎仮想化技術ベンダーコントロールインフラ実機演習業務効率化ソフトウェアテスト基礎C# 応用npm業務知識/業界知識リスクコントロールパケット解析テストケース内部設計クリティカル・シンキングER図プロジェクト管理情報セキュリティマネジメントインフラ監視gulpマーケティングネゴシエーションリーダブルコードCiscoスクラムCentOSActive Directoryインターネットルーティング応用ビルドツールAWSITサービスマネジメントセキュリティ入門簿記ITパスポートネットワーク管理モダンJS (Modern JavaScript) 基礎IT基礎Python入門労働関連法データサイエンティストネットワーク入門PMBOK®Junitヒューマンスキルコンテナ次世代高度IT人材HTML/CSSパフォーマンスチューニング冗長化入門

過去の記事