web-dev-qa-db-ja.com

コメントシステムのMYSQLスキーマ

次のテーブル設定で作成しているアプリに基本的なコメントシステムがあります。

CREATE TABLE `meet_comment` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `meet_id` int(11) NOT NULL,
 `user_id` int(11) NOT NULL,
 `date_created` datetime NOT NULL,
 `comment` mediumtext NOT NULL,
 PRIMARY KEY (`id`),
 KEY `meet_id` (`meet_id`),
 KEY `user_id` (`user_id`),
 CONSTRAINT `meet_comment_ibfk_1` FOREIGN KEY (`meet_id`) REFERENCES `meet` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `meet_comment_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

meet_idは、ユーザーがコメントしているオブジェクトへの参照です。これはうまくいきますが、現時点では、ユーザーがコメントを編集した場合、commentフィールドを更新するだけです。

コメントが編集された場合にコメント履歴を表示できるようにしたいのですが、これについて最善の方法は何ですか?コメントと参照を保持する別のテーブルが必要になると思いますmeet_comment.id?たぶん:

CREATE TABLE `meet_comment` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `meet_id` int(11) NOT NULL,
 `user_id` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `meet_id` (`meet_id`),
 KEY `user_id` (`user_id`),
 CONSTRAINT `meet_comment_ibfk_1` FOREIGN KEY (`meet_id`) REFERENCES `meet` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `meet_comment_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

CREATE TABLE `meet_comment_content` (
 `revision` int(3) NOT NULL,
 `meet_comment_id` int(11) NOT NULL,
 `date_created` datetime NOT NULL,
 `comment` mediumtext NOT NULL,
  UNIQUE KEY `revision_2` (`revision`,`meet_comment_id`),
 KEY `revision` (`revision`),
 KEY `meet_comment_id` (`meet_comment_id`),
 CONSTRAINT `meet_comment_content` FOREIGN KEY (`meet_comment_id`) REFERENCES `meet_comment` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

もしそうなら、テーブルをクエリするための最良の方法は何でしょうか、私は必要なデータを取得するために結合を行うことができると思いますか?

4
pjknight

データベースの設計中のいくつかのポインター-

  1. データベースを設計するときは、データを論理的に分離することが最善の方法です。例-commentテーブルにはコメントのみが含まれ、ミートやユーザーに関する情報は含まれません。
  2. マッピングには個別のマッピングテーブルが必要です。これにより、必要な柔軟性が得られます。したがって、将来的にRedditのようなコメント(ネストされたコメント)にコメントする機能を追加したい場合は、マスターcommentparent_comment_idの追加の列を導入することで簡単に行うことができますテーブル。

IMO次のテーブルがあるはずです-

  1. user- user_id、およびその他のユーザー関連フィールド
  2. meet- meet_idおよびその他のミート関連フィールド
  3. comment- comment_idrevision_id、およびその他のコメント関連フィールド
  4. user_meet_mapping- user_idmeet_idなど.
  5. meet_comment_mapping- meet_idcomment_idなど.

このスキーマは、達成できる最適な正規化です。クエリに関する限り、さまざまなページ分割された結合クエリによってクエリを抽出できます。

0
Mukul Bansal