#前提
cakePHP3のチュートリアルを自分なりにアレンジしようとしています。
多対1の関係にあるテーブルを多対多の関係にするため、中間テーブルを作りました。
そうしてできたのが、以下3つのテーブルです。
左がBookmarksテーブル、右がTagsテーブルです。
話に関係ないカラムは省略しています。
|id|bookmark|||id|tag|
|:--:|:--:|:--:|:--:|:--:|
|1|黒バス|||1|comic|
|2|ヒロアカ|||2|sports|
そして、中間テーブルのBookmarks_Tags。
bookmark_id | tag_id |
---|---|
1 | 1 |
1 | 2 |
2 | 1 |
- BookmarksもTagsも頻繁に作られたり削除されたりします。
- それぞれのBookmarkが関係するTagも頻繁に変わります。
- BookmarkとTagの関係は、理論上あり得る関係を網羅します。
#現在考えているデータベースの運用
新しい関係が作られたら中間テーブルにinsert、関係が削除されたらdeleteを行います。
例えば、「黒バス」Bookmarkから「comic」Tagを外す場合、上記中間テーブルの一番上のレコードがdeleteされます。
「ヒロアカ」Bookmarksに「sports」Tagをつけようる場合はbookmark_id=2, tag_id=2のレコードがinsertされます。
#疑問
前置きが長くなりましたが、自分の現在の疑問は以下の通りです。
- 中間テーブルの運用方法はinsertとdeleteを行うという方法で問題ないでしょうか?それとも、理論上あり得る関係をすべて中間テーブルに保存しておいて、delete_flagカラムを用いて論理削除などを行う方法にするべきでしょうか?
- もっと効率の良いDB設計があれば是非教えてほしいです。
- 中間テーブルに主キーは必要ですか?
#自分の考え
疑問のところにも書いた「delete_flagを用いた方法」だと、中間テーブルのレコード数がすごい勢いで増えてしまい、よくないかと考えたので、insertとdeleteを用いる方法を現在は採用しています。
#補足情報
cakePHP 3.4.8
php 7.0.20
MySQL Ver 15.1 Distrib 10.1.24-MariaDB
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。