URL: https://4tsuba.site
※2022/03/30 公開停止
twitter や他の掲示板を参考に、こんな機能の掲示板があればと思いつくりました。
よろしければ、書込をしていただけると嬉しいです(ゲストユーザーをご使用いただけます)。
-
-
言語
- HTML5
- CSS3
- JavaScript (Vue.js)
-
フレームワークと主要パッケージ
フレームワーク / パッケージ バージョン 用途 Vue.js 2.6.14 - vuetify 2.5.10 UI vue-router 3.5.2 ルーティング vue-image-lightbox 7.2.0 画像の拡大表示 jaconv 1.0.4 ひらがな ⇔ カタカナ ⇔ カタカナ の変換
-
-
-
言語
- PHP (8.0.8)
-
フレームワークと主要パッケージ
フレームワーク / パッケージ バージョン 用途 Laravel 8.67.0 - sanctum 2.12.0 SPA 認証 PHPUnit 9.5.10 テスト telescope 4.6.5 デバッグ / SQL の確認 (開発環境のみ) -
DB
- mysql (8.0.27)
-
-
-
AWS
サービス 用途 VPC ネットワーク構築 Route53 DNS ルーティング ACM SSL 証明書の発行 EC2 (インスタンス) web サーバー EC2 (ALB) クライアントとの HTTPS 通信
-
モデル | 作成 | 読取 | 更新 | 削除 |
---|---|---|---|---|
ユーザー | ○ | ○ | ○ | ○ |
(ゲストユーザー) | × | ○ | △ | × |
スレッド | ○ | ○ | × | × |
書込 | ○ | ○ | ○ | ○ |
画像 | ○ | ○ | ○ | ○ |
返信 | ○ | ○ | ○ | ○ |
いいね | ○ | ○ | - | ○ |
ワードミュート | ○ | ○ | - | ○ |
ユーザーミュート | ○ | ○ | - | ○ |
-
Laravel が生成する SQL を確認した
-
Eloquent
同じ目的であっても、使用するメソッドにより生成する SQL が異なる。- leftJoin() の場合
Eloquent:Image::leftJoin('posts', 'images.post_id', '=', 'posts.id')->get();
↓
SQL:select * from images left join posts on images.post_id = posts.id;
- with() の場合
Eloquent:Image::with('post')->get();
↓
SQL1:select * from images;
SQL2:select * from posts where posts.id in (1, 2, 3);
- leftJoin() の場合
-
FormRequest
- likes テーブルのユニーク制約
StoreLikeRequest:
Rule::unique('likes')->where(function ($query) { return $query->where('user_id', Auth::id());})
↓
SQL:select count(*) as aggregate from likes where post_id = 1 and (user_id = 1);
- likes テーブルのユニーク制約
-
-
頻度の高いリクエストで生成される SQL が軽くなるテーブル設計を考えた
- 正規化されていないカラムをつくった
images
テーブルのthread_id
カラム
テーブルを正規化し毎度images
テーブルとposts
テーブルを結合(or サブクエリ)することは、書込件数が多くなるほど重くなると考え、images
テーブルにthread_id
カラムをつくった。
- カウント用カラムをつくった
threads
テーブルのposts_count
カラム
スレッドの書込数を取得するとき、2 種類の方法がある。
(1)書込数カラムをつくり、書込送信(post)時にインクリメントする
(2)書込数カラムをつくらず、書込取得(get)時にレコード数をカウントする
→ スレッドの書込数取得では、(1)を採用した。
(リクエストの頻度は、書込送信 < 書込取得 であり、高頻度に発行される書込取得 SQL を軽くする。)
- 正規化されていないカラムをつくった
-
PHPUnit を使用した
-
Vue を使用し SPA とした
-
親子コンポーネントの役割から、各コンポーネントに定義するメソッドを考えた
- スレッド一覧取得(親:
Threads
コンポーネント / 子:Sort
コンポーネント)
親子コンポーネント間で API 取得に必要なパラメータが跨るとき、2種類の方法がある
(1)子コンポーネントが API を叩く。その後、取得結果を親コンポーネントへ emit する
(2)親コンポーネントが API を叩く。先じて、子コンポーネントが親コンポーネントの欲するパラメータを emit する
→ スレッド一覧取得では、(2)を採用した。
(Threads
コンポーネントがスレッドを取得する。Sort
コンポーネントは並び替えキーを emit する。)
- スレッド一覧取得(親:
-
リソースの CRUD を意識し API を作成した
- 使用した HTTP メソッド:
GET
,POST
,PUT
,PATCH
,DELETE
HTML フォームに縛られないため、GET
,POST
以外の HTTP メソッドを使用した。
取得したいリソースの単数 or 複数に注意し、リターンを想像できる URL を定義した。
- 使用した HTTP メソッド:
-