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

0 コメント