DB View 入門

こんにちは!新チームの立ち上げ準備がほとんど進んでおらず茫然自失の hikaru-kimi です!

Rails エンジニアの皆さんはDB操作をする際どのように操作されてますか? 恐らく Rails 標準ORMツールの ActiveRecord かと思います

ActiveRecord は便利ですが、SQLを知らないと不便なこととかやっぱりありますよね

ということで、今回は DB の View について解説していきたいと思います

DB の View とは、一言で言い表すと SELECT 文で作成された仮想的なテーブルです

決まった複雑なSQLを毎度組み立てるのって案外骨折れますよね?そんなとき、view を利用すれば簡単に出力可能となります

また、専用のテーブルを作成する必要がありませんので、DBの容量の節約にも繋がります

View の作成方法と使用方法

では試しに view を作成してみましょう

authors has many books の関係を持つ authors テーブルと books テーブルがあるとします

=> \d authors;
                     Table "public.authors"
 Column |         Type          | Collation | Nullable | Default
--------+-----------------------+-----------+----------+---------
 name   | character varying(20) |           | not null |
 id     | integer               |           | not null |
Indexes:
    "authors_pkey" PRIMARY KEY, btree (id)
Referenced by:
    TABLE "books" CONSTRAINT "books_author_id_fkey" FOREIGN KEY (author_id) REFERENCES authors(id)

=> \d books;
                        Table "public.books"
  Column   |         Type          | Collation | Nullable | Default
-----------+-----------------------+-----------+----------+---------
 title     | character varying(20) |           | not null |
 id        | integer               |           | not null |
 author_id | integer               |           | not null |
Indexes:
    "books_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
    "books_author_id_fkey" FOREIGN KEY (author_id) REFERENCES authors(id)

この2テーブルを元に、books の title と authors の name を表示する view を作成したいと思います

普通に SQL で select するのであれば、以下のようなとても複雑な SQL を記述する必要があります

=> SELECT
->   books.title,
->   authors.name
-> FROM
->   books
->   INNER JOIN authors ON authors.id = books.author_id;
       title        | name
--------------------+------
 The Great Gatsby   | John
 War and Peace      | John
 Gone With the Wind | Mary
(3 rows)

しかし、以下のように view を作成すれば上記の出力が簡単なSQLだけで済みます

=> CREATE VIEW book_authoer_views AS
-> SELECT
->   books.title,
->   authors.name
-> FROM
->   books
->   INNER JOIN authors ON authors.id = books.author_id;
CREATE VIEW
=> SELECT
->   *
-> FROM
->   book_authoer_views;
       title        | name
--------------------+------
 The Great Gatsby   | John
 War and Peace      | John
 Gone With the Wind | Mary
(3 rows)

弊社インゲージでは、様々な技術に関心を持てるエンジニアを募集しています

少しでも興味の湧いた方は、以下のリンクよりどうぞご応募をよろしくお願いいたします