E-R図

素人が2020年までの1ヶ月でLINE BOTに挑戦する毎日note. 【Day 14:DBスキーマの定義part 1】

こんにちは!
12月1日から2019年残り1ヶ月でスケジュール調整BOTの開発に挑戦している"くろ"です。

BOTの概要:Day 2の記事

BOTの仕様:機能一覧やフローチャート Day 10の記事

開発全体像はこちら:

作り方1

作り方2

本日はDBスキーマの定義をしていきたいと思います。

が、始める前にまずはどういうことをしていくのか?を理解していきたいと思います。

まずDBスキーマの定義とはこの4つを定義していくことらしいです。

1,Entity
2,Repository
3,Service logic
4,Controller

1つ1つ見ていきましょう。今日はEntityです。

1,Entity

実世界に存在するものの中で、データベースとして表現すべき対象物をエンティティ (entity:実体) と呼びます。また、エンティティとエンティティの相互関係をリレーションシップ (relationship:関連) と呼びます。そして、この関係を図示し、エンティティとエンティティの間のリレーションシップを分析する技法を ER(Entity-Relationship) モデルといいます。
※E-R図とは?
ER モデルでは、先ほど説明したリレーションシップの対応によって、エンティティとエンティティを矢印で次のように結びます。
ER モデルは、エンティティとエンティティのリレーションシップを図で表したものです。
https://www.techscore.com/tech/sql/SQL16/16_01.html/

ふむふむ、なんとなくわかったようなわからないような。

さらに調べる。

エンティティ(英:entity)とは「実体」のこと。
ちょっとズルい書き方をすると
E-R図で出てくる箱のことです。
https://wa3.i-3-i.info/word11594.html

なんとなく理解できてきた気がします。

師匠から教わったことも踏まえると、Entityというのはデータベースの中の実体と呼ばれるもので、学校のデータベースだとすると、学校や学生という箱をEntityと考えればよさそうです。

図にするとこんな感じです。

E-R図

もう少し自分なりに噛み砕いていきます。

この記述を踏まえると、

画像4https://www.techscore.com/tech/sql/SQL16/16_01.html/

サービスで利用するあらゆるデータの中で、1:1の関係に落とせないデータの単位をEntityと呼べばよさそうです。例えば、学校と学校名は1:1なので、Entity(箱)と属性(中身)の関係になるので、学校はEntity、学校名は属性となります。また、学生と学籍番号なども1:1なので、学生がEntity、学籍番号が属性になりそうです。
そして、その箱同士(=Entity同士)は学校と学生のように1:Nの関係で結ばれることでデータベースの構造ができていくということになります。

ちなみに、日本MySQLユーザ会副代表の方のインタビュー記事で、

最初は大きいものから抽出していく
──エンティティを抽出する際、坂井さんはまず何から着手しますか?

坂井 このフェーズにおいては「なるべく大きな要素から抽出していく」のが大切です。仮に「車をWeb上で販売するサービス」のデータベースを設計するならば、私なら「車」と「顧客」という粒度の大きなエンティティから考えていくでしょう。

──「メーカーは何か?」「顧客の年齢や居住地は?」など、つい細部が気になってしまう方もいると思います。このフェーズでそうした情報を検討する必要はないのですか?

坂井 そうしたアイデアが途中で浮かぶこともあると思います。でも、エンティティ抽出の段階で細部から考えてしまうと、情報の粒度がそろわなくなってしまいますし、不要なエンティティを無駄に検討してしまう可能性も高いです。
とはいえ、途中で浮かんだ「こんな情報が必要かもしれない」というアイデア自体は価値が高いので、それらは別途メモしておき、後続のフェーズで利用すればいいと思います。
https://employment.en-japan.com/engineerhub/entry/2018/06/22/110000

こういったことを記述されておられるので、

Entityを決めていく際には、一番大きい単位だと思われるEntityから作っていき、その要素になりそうなデータたちについては、1:1なのか?1:Nなのか?N:Nなのか?を考えながら、最後1:1の関係になるまで落としていれば、全てのEntityと属性を決めることができそうです。

ということなので、まずはGoogleのスプレッドシートを使って、スケジュール調整BOTの場合のEntityを定義していきたいと思います。

ちなみに、EntityはEntity クラスという形で記述していくようです。実際に構成するときは、作成したスプレッドシートを参考にこういったコードを書いていく必要があります。

class User {
    int id;
    string name;
    Datetime createdAT;
    Datetime updatedAT;

}

※あくまでイメージ。

次はrepositoryですね。

いつも読んで頂きありがとうございます。

今後もよろしくお願いします!

この記事が参加している募集

よろしければサポートお願いします! 頂いたサポートはクリエイター活動に活用させて頂きます。