LoginSignup
Michinosuke
@Michinosuke (みちのすけ)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

3つのテーブルの多対多の中間テーブルのベストプラクティス

DiscussionClosed

ユーザが何らかの役職でグループに属している」のような状況でデータベースを設計する場合、どのようにリレーションを設計するのがベストでしょうか。

案1

スクリーンショット 2020-10-24 10.42.08.png

案2

LaravelのPivotモデルを使い中間テーブルから関係を取得するというページに載っていました。
スクリーンショット 2020-10-24 10.41.49.png

案3

(UsersテーブルがVARCHARとかになってるのは特に意味ないです。)
中間テーブル.png

  • バリデーションすればいいので案1でいいのではないか
  • 役職がたくさん増えないなら案3がいいのではないか
  • 案2は正規化されているが、ORMでの操作が複雑化するのでよくないのではないか

など考えて、Eloquentとかと相性が良さそうな案3がいいのではないかと思いましたが、よくわかりません。

データベース設計の実務経験が乏しいので意見をお聞きしたいです。
よろしくお願いします。

0

議題への理解にも自信が持てないし、ベストかどうかも解らないのですが、賑やかしに、自分ならどうしたいかを書いてみます。
的外れでしたら申し訳ありません。

  • DBの要件に対しては次のように解釈しています。
    • Usersは楽曲の利用者ではなく、音楽家(アーティスト)である。
    • Musicはスコア(総譜)であって、音源ではない。
    • 一人のメンバーが、同一あるいは異なる楽曲において、複数の役職を担いうる。
    • 一つの楽曲に同じ役職の異なるメンバーが参加しうる。
  • 案1
    • ここで示されているValidateとは、本来テーブルにすべき情報を、プログラム上のデータやコードにするか、カラムの制約としてハードコーディングするか、FileMakerの値一覧のような別のテーブルにするなど、別の形で持つことなのではないかと思います。
    • 役職が三つ(作曲、編曲、作詞)だけで増える可能性がないなら、それでもいいのかなと思います。
  • 案2
    • 役職という属性が多種の値を持ちうるのですから、役職のテーブルを用意することは自然に思えます。
    • 例えば、「実は楽曲が音源で、歌唱、演奏、指揮、楽器毎の奏者など、さらに多くの役職が必要になって…」などと考えると、やはりテーブルを作りたいです。
    • 「ORMでの操作が複雑化する」懸念は、ビューとかプログラムとかででなんとかする(してもらう)ことにして、DBのデザインを優先したいです。
  • 案3
    • 案1は、後から案2にすることも容易に思えますが、案3は後から苦労しそうで、この題材であれば使いたくないです。
  • 案0
    • 最後の要件がない(=一つの役職に一人ずつ)ならば、Musiccomposer_idとかを用意して直結することも考えられます。
    • 実際にそれで作ってしまった後で必要になって、仕方なく複数アーティストのユニットとして登録してごまかすようなことがありました。
2

@tetr4lab
回答ありがとうございます!
とても分かりやすくて参考になりました。

「ORMでの操作が複雑化する」懸念は、ビューとかプログラムとかででなんとかする(してもらう)ことにして、DBのデザインを優先したいです。

この考え方はすごく良いなと思いました。その方が後々面倒なことにならなそうですね。

最後の要件がない(=一つの役職に一人ずつ)ならば、Musicにcomposer_idとかを用意して直結することも考えられます。

これは全く考えれていなかったのですが、そもそも多対多なのか、ということはしっかり考えないといけないのですね。

0

Your answer might help someone💌