IT-Q

記事とタグのような多対多を設計するとき、正しいのはどれですか。

記事とタグなら article_tag のような中間テーブルを置いて繋ぎます。Eloquent の定義だけでなくDB側にも外部キー制約を張り、アプリの検査に依存しない状態にします。

面接官が見ているのはDB設計をEloquent任せにしていないか。

よくある答えと、面談でどう見られるか

  • 中間テーブルを作って belongsToMany で繋ぎ、DB 側にも外部キー制約を張る
    その通りです。アプリ側のチェックはバグやバッチですり抜けるので、最後の砦は DB 側に置きます。
  • 記事テーブルにタグを カンマ区切りの文字列で持つ
    検索も集計もできなくなり、正規化の観点からも避けます。
  • タグの数だけ記事テーブルにカラムを追加する
    タグが増えるたびにスキーマ変更が必要になります。
  • hasMany を両側のモデルに書く
    多対多では belongsToMany を両側に書きます。hasMany は1対多です。

面接官は何を見ているか

  • 具体的なリレーション種別を挙げた
  • 中間テーブルの存在を説明できた
  • 外部キー制約に触れた

模範解答

多対多は中間テーブルを作って belongsToMany で繋ぎます。たとえば記事とタグなら article_tag テーブルを置きます。Eloquent 側の定義だけでなく、DBにも外部キー制約を張ります。アプリ側の整合性チェックはバグやバッチ処理ですり抜けるので、最後の砦はDB側に置くべきだと考えています。

ここからどう深掘りされるか

この問いに答えられた場合、面談は次の質問に進みます。