「掲示板」と「記事」の閲覧履歴の保存にあたって、同じテーブルにすべきか否か

前提

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 コメント