前提
MySQLとphpで簡単な掲示板サイトを作る中で、閲覧履歴の保存に取り組んでいます。
実現したいこと
「掲示板」と「記事」というコンテンツがあるのですが、「掲示板の閲覧履歴」と「記事の閲覧履歴」を同じテーブルにすべきか否か、その判断基準を知りたいです。
発生している問題
以下2パターン考えましたが、「どちらが、どういうときに良いのか?」判断できません…。
【パターン1】同じテーブルにする
【パターン2】別のテーブルにする
基本テーブル
まず基本的には次の「ユーザー、掲示板、記事」の3つがあります。
SQL
1CREATE TABLE tbl_users ( 2 `ID` INT(10) PRIMARY KEY AUTO_INCREMENT, 3 `name` VARCHAR(100) 4); 5CREATE TABLE tbl_threads ( 6 `ID` INT(10) PRIMARY KEY AUTO_INCREMENT, 7 `title` VARCHAR(100), 8 `user_ID` INT(10), 9 CONSTRAINT fk_threads_01 FOREIGN KEY (`user_ID`) REFERENCES tbl_users (`ID`) 10); 11CREATE TABLE tbl_posts ( 12 `ID` INT(10) PRIMARY KEY AUTO_INCREMENT, 13 `title` VARCHAR(100), 14 `content` VARCHAR(1000), 15 `user_ID` INT(10), 16 CONSTRAINT fk_posts_01 FOREIGN KEY (`user_ID`) REFERENCES tbl_users (`ID`) 17);
閲覧履歴テーブル
以下に問題の2パターンを記載します。
尚count_visiteds
カラムはDUPLICATE KEY UPDATE
でカウントアップする意図です。
【パターン1】同じテーブルにする
まず閲覧履歴を同じテーブルに保存するならこうだと思います。
SQL
1CREATE TABLE tbl_visiteds ( 2 `post_ID` INT(10), 3 `thread_ID` INT(10), 4 `user_ID` INT(10), 5 `count_visiteds` INT(10), 6 UNIQUE u_visiteds_01 (`post_ID`, `thread_ID`, `user_ID`), 7 CONSTRAINT fk_visiteds_01 FOREIGN KEY (`post_ID`) REFERENCES tbl_posts (`ID`), 8 CONSTRAINT fk_visiteds_02 FOREIGN KEY (`thread_ID`) REFERENCES tbl_threads (`ID`), 9 CONSTRAINT fk_visiteds_03 FOREIGN KEY (`user_ID`) REFERENCES tbl_users (`ID`) 10);
【パターン2】別のテーブルにする
または別のテーブルだとこうだと思います。
sql
1CREATE TABLE tbl_visited_posts ( 2 `post_ID` INT(10), 3 `user_ID` INT(10), 4 `count_visiteds` INT(10), 5 UNIQUE u_visited_posts_01 (`post_ID`, `user_ID`), 6 CONSTRAINT fk_visited_posts_01 FOREIGN KEY (`post_ID`) REFERENCES tbl_posts (`ID`), 7 CONSTRAINT fk_visited_posts_02 FOREIGN KEY (`user_ID`) REFERENCES tbl_users (`ID`) 8); 9CREATE TABLE tbl_visited_threads ( 10 `thread_ID` INT(10), 11 `user_ID` INT(10), 12 `count_visiteds` INT(10), 13 UNIQUE u_visited_threads_01 (`thread_ID`, `user_ID`), 14 CONSTRAINT fk_visited_threads_01 FOREIGN KEY (`thread_ID`) REFERENCES tbl_threads (`ID`), 15 CONSTRAINT fk_visited_threads_02 FOREIGN KEY (`user_ID`) REFERENCES tbl_users (`ID`) 16);
自分の考え
まず同じテーブルの場合、記事を閲覧した際はthread_ID
カラムにNULL
を、掲示板を閲覧した際はposts_ID
カラムにNULL
を入れざるを得ないかと思います。つまり必ず一方のカラムがNULL
になり、この点どうなのかと疑問です。
または別のテーブルの場合、「コンテンツの数だけ閲覧履歴テーブルが増える」ということにやや違和感を覚えます。さらにINSERT
のクエリを2回実行しなければならない点も疑問です。
以上のように、「どちらが、どういうときに良いのか?」判断できません…。
「そっちのパターンだとこういうときに困る」「もっと別のパターンが良い」など先人の皆様からアドバイスを頂戴できましたら幸いです。
バージョン
PHP 8.0
MySQL 5.7.31
phpMyAdmin 4.4.15.10
宜しくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/09/07 13:04
2022/09/07 16:17
2022/09/07 17:05
2022/09/07 17:36