![E-R図](https://assets.st-note.com/production/uploads/images/16905658/rectangle_large_type_2_5fc8c153f3bc5fea3fb115890abcb57b.png?width=1200)
素人が2020年までの1ヶ月でLINE BOTに挑戦する毎日note. 【Day 14:DBスキーマの定義part 1】
こんにちは!
12月1日から2019年残り1ヶ月でスケジュール調整BOTの開発に挑戦している"くろ"です。
BOTの概要:Day 2の記事
BOTの仕様:機能一覧やフローチャート Day 10の記事
開発全体像はこちら:
本日は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と考えればよさそうです。
図にするとこんな感じです。
もう少し自分なりに噛み砕いていきます。
この記述を踏まえると、
https://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ですね。
いつも読んで頂きありがとうございます。
今後もよろしくお願いします!
この記事が参加している募集
よろしければサポートお願いします! 頂いたサポートはクリエイター活動に活用させて頂きます。