ER図の出力方法、ER図に沿った実装方法

はじめに

ER図はwebアプリのデータベース設計でよく使われるものです。
今回は、RailsアプリケーションでER図をどういう風に出力するか、
また、ER図を読み解いてどのようにモデルを実装していくかをご説明いたします

ER図とは

ER図とはEntitiy-Relationship Diagramの略で
モデルの構造、モデルの関係を示した図になります。

多くの開発では、はじめにER図を作り、それを元にアプリケーションを作っていきます。

実行環境

この記事は以下の動作環境で動作確認しています。

  • ruby (2.6.3)
  • rails (5.1.7)

また、今回は例としてRailsチュートリアルのサンプルアプリケーションを用いて、ER図を出力します。

ER図出力方法

  • graphvizのインストール
  • rails-erd gemのインストール
  • ER図の出力
  • ER図出力のオプション

graphvizのインストール

  $ sudo yum install graphviz

yum以外では

  • homebrewの場合
  $ brew install graphviz
  • apt-getの場合
  $ sudo apt-get install graphviz

でインストールします。

rails-erd gemのインストール

Gemfileの中に

gem 'rails-erd'

と入力し

$ bundle install

を実行します。これで準備完了です。

ER図の出力

$ bundle exec erd

これを実行すると

Loading application in 'sample_app'...
Generating entity-relationship diagram for 4 models...
Diagram saved to 'erd.pdf'

と表示され、ER図がvenderファイル内に生成されます。

ER図にオプションを指定していない場合、
以下のような図が出力されます。


注意点
  • appのモデルの中に belongs_to, has_many, has_one などのリレーションを指定していないと、ER図に反映されません。また、rails db:migrate を実行しないとER図に反映されません

ここから、オプションを付けて見た目を良くします。

ER図出力のオプション

今回は、IE記法を用いて、外部キーを記載したER図を作っていきます。

IE記法とは

information Engineering Notationの略で、
現在、現場で多く使用されるER図の記法になります。

どういうオプションを指定するかを確認するために

$ erd -h

以下のようにオプションの一覧が出てきます

Usage: erd [-vc]

Diagram options:
        --title=TITLE                Replace default diagram title with a custom one.
        --notation=STYLE             Diagram notation style, one of simple, bachman, uml or crowsfoot.
        --attributes=TYPE,...        Attribute groups to display: false, content, primary_keys, foreign_keys, timestamps and/or inheritance.
        --orientation=ORIENTATION    Orientation of diagram, either horizontal (default) or vertical.
        --inheritance                Display (single table) inheritance relationships.
        --polymorphism               Display polymorphic and abstract entities.
        --direct                     Omit indirect relationships (through other entities).
        --connected                  Omit entities without relationships.
        --only                       Filter to only include listed models in diagram.
        --only_recursion_depth=INTEGER
                                     Recurses into relations specified by --only upto a depth N.
        --exclude                    Filter to exclude listed models in diagram.
        --sort=BOOLEAN               Sort attribute list alphabetically
        --prepend_primary=BOOLEAN    Ensure primary key is at start of attribute list
        --cluster                    Display models in subgraphs based on their namespace.
        --splines=SPLINE_TYPE        Control how edges are represented. See http://www.graphviz.org/doc/info/attrs.html#d:splines for values.

Output options:
        --filename=FILENAME          Basename of the output diagram.
        --filetype=TYPE              Output file type. Available types depend on the diagram renderer.
        --no-markup                  Disable markup for enhanced compatibility of .dot output with other applications.
        --open                       Open the output file after it has been saved.

Common options:
        --help                       Display this help message.
        --debug                      Show stack traces when an error occurs.
    -v, --version                    Show version and quit.
    -c, --config=FILENAME            Configuration file to use

今回はこの内の–notation=STYLE、–attributes=TYPEを使います。

–notation=STYLE(記法の設定)

Diagram options:の下に–notation=STYLEとあり、
そこに書いてあるようにDiagram notation styleには

  • one of simple
  • bachman
  • uml
  • crows foot


    の種類があるので、今回はこの中の crows foot を使います。

rails-erd のリポジトリのCHANGE.md(更新履歴)に、

Crow’s foot notation (also known as the Information Engineering notation) can be used by adding ‘notation=crowsfoot’ to the ‘rake erd’ command

と書いてある通り、
crows footを使うとIE記法のER図を出力することができます

–attributes=TYPE(表示の設定)

今回はこちらも使っていきます。foreign_keysが外部キー、contentが中身を意味しています。

ここまでできたら、以下のコマンドで再度ER図を出力し、見た目を確認してみましょう。

bundle exec erd --notation=crowsfoot --attributes=foreign_keys,content


このように、見た目が変わったのが分かるかと思います。

オプションを設定することで、外部キーを考慮したIE記法のER図が完成しました。

同様のやり方で–filename=FILENAMEで好きなファイル名にしたり、–filetype=TYPEで保存形式をpdf以外に変えることもできます。

ER図に沿った実装方法

  • ER図サンプル
  • 関連付けの実装

ER図サンプル

今回はこのようなモデルが4つある図で説明します。

上図において、各テーブルを繋いでいる線の意味は以下のとおりです。

  • ○ は0個以上持つという意味になります
  • - は1個あるという意味になります
  • = はただ一つあるという意味(必ず一つだけある)という意味になります
  • ○と-がある場合、2つの記号を合わせて、0個以上持つ または、1個あるという意味になります。
  • 三本線(鳥の足のような形状)は複数個(1個以上も含む)の意味になります。
  • 三本線と○がある場合も、2つの記号を合わせて、0個以上もつ、または、複数個持つという意味になります。

これらを踏まえると、各テーブルは以下のような関係を持っていると言えます。一部説明を省略していますが、以下の説明図を元に関係を予想してみてください。

モデルの実装

このER図を元にして、モデルを作っていきます。

# db/migrate/[timestamp]_create_students.rb
class CreateStudents < ActiveRecord::Migration[5.1]
 def change
    create_table :students do |t|
    t.string :name
    t.integer :age
    t.string :phone
    t.string :address

    t.timestamps
    end
  end
end
# db/migrate/[timestamp]_create_id_cards.rb
class CreateIdCards < ActiveRecord::Migration[5.1]
  def change
    create_table :id_cards do |t|
      t.integer :number
      t.references :student, foreign_keys: true
      t.boolean :active

      t.timestamps
    end
  end
end
# db/migrate/[timestamp]_create_lessons.rb
class CreateLessons < ActiveRecord::Migration[5.1]
  def change
    create_table :lessons do |t|
      t.string :title
      t.string :teacher
      t.integer :cost
      t.text :comment

      t.timestamps
    end
  end
end
# db/migrate/[timestamp]_create_student_lessons.rb
class CreateStudentLessons < ActiveRecord::Migration[5.1]
  def change
    create_table :student_lessons do |t|
      t.references :student, foreign_keys: true
      t.references :lesson, foreign_keys: true

      t.timestamps
    end
  end
end

関連付けの実装

マイグレーションを実行しモデルを作成したら、ER図をもとにbelongs_to, has_one, has_many等を使って、モデルの関連付けを実装します。

# models/concerns/id_card.rb
class IdCard < ApplicationRecord
  belongs_to :student
end
# models/concerns/lesson.rb
class Lesson < ApplicationRecord
  has_many :student_lesson, dependent: :destroy
end
# models/concerns/student.rb
class Student < ApplicationRecord
  has_one :id_card, dependent: :destroy
  has_many :student_lesson, dependent: :destroy
end
# models/concerns/student_lesson.rb
class StudentLessons < ApplicationRecord
  belongs_to :lesson
  belongs_to :student

おわりに

  • データベース設計手法の一つであるER図について
  • RailsアプリケーションにおけるER図出力方法
  • ER図(特にIE記法) の読み解き方、およびそれをもとにした実装方法

以上をご説明いたしました。