web-dev-qa-db-ja.com

ブログのデータベースを構築する

ブログ用のデータベースを構築しました。私はまだ学生なので、この分野の知識は限られています。私はこの質問を投稿して、私が何を間違っているのか、なぜ、どのようにそれを修正できるのかについて簡単に説明します。私はバックエンドの開発者ではないので、この投稿から何かを誤解した場合は、さらに説明します。

これはシンプルなブログプロジェクトです。次の手順は、管理者とユーザーが使用できます。

[〜#〜] admin [〜#〜]

  • ブログに投稿者として登録する
  • 役職
  • 記事を書く

[〜#〜]ユーザー[〜#〜]

  • 投稿を見る
  • 投稿のように
  • コメントを投稿
  • コメントをいいね!

以下は、上記の手順で使用するテーブルです。

  • authors(ブログの登録済み著者を保持します)
  • 投稿(投稿に必要なすべての情報を保持します)
  • コメント(コメントに必要なデータを保持します)
  • likes_counter(ユーザーが投稿またはコメントに対して行った一意のいいね!を保持します)

作成者と投稿のテーブルの関係

1対多の関係を使用してauthorspostsテーブル。各著者は多くの投稿を書くことができ、すべての投稿には1人の著者が必要です。

EER図は以下のとおりです。

authors and posts database diagram for a blog

authorspostsテーブルスキーマの両方を次に示します。

CREATE TABLE IF NOT EXISTS `authors` (
  `author_ID` bigint(10) unsigned NOT NULL AUTO_INCREMENT,
  `author_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `author_avatar` text COLLATE utf8_bin NOT NULL,
  `author_description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`author_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `posts` (
  `post_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `post_date` datetime NOT NULL,
  `post_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `post_status` varchar(20) COLLATE utf8_bin NOT NULL DEFAULT 'draft',
  `post_type` varchar(10) COLLATE utf8_bin NOT NULL,
  `post_like_count` int(10) unsigned NOT NULL DEFAULT '0',
  `post_comment_count` int(11) unsigned NOT NULL DEFAULT '0',
  `post_has_article` tinyint(4) NOT NULL DEFAULT '0',
  `article_title` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `article_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`post_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;

Q1

どのように関係を作成する必要がありますか?

コメント表

  • 各投稿はコメントを保持できます
  • ユーザーはコメントにできません
  • 各コメントをお気に入りにすることができます

下は図です:

Comments database diagram for a blog

そしてテーブルスキーマ:

CREATE TABLE IF NOT EXISTS `comments` (
  `comment_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `comment_post_ID` bigint(20) unsigned NOT NULL,
  `comment_count` bigint(20) unsigned NOT NULL,
  `comment_author` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `comment_author_IP` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `comment_date` datetime NOT NULL,
  `comment_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  `comment_approved` tinyint(4) NOT NULL DEFAULT '0',
  `comment_like_count` int(10) unsigned NOT NULL,
  `comment_author_email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`comment_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;

Q2

これに関する私の主な懸念は、どの投稿がどのコメントを保持しているかをどのようにして知るかです。現在の投稿のIDを保持する列comment_countを作成しました。

例:

300, 301, 302というIDを持つ3つの記事と4つのコメントがあるとします。次に、各行は次の形式になります。

comment_ID  -  comment_post_ID - comment_count
1              300               1
2              301               1
3              301               2
4              301               3

302というIDを持つ記事にはコメントがないため、行は登録されていません。 多対多の関係のようですが、正確ではありません。正しいフォームを使用していますか?

Likes_Counterテーブル

これは私が取った最も難しい決定でした。

  • 各記事をお気に入りにすることができます
  • 各コメントをお気に入りにすることができます
  • ユーザーはそのアクションを実行するためにアカウントを必要としません。
  • アイテム(単一の投稿またはコメント)をお気に入りに追加できるのは1回だけです。 重複したフェイブは許可されません

これらすべてを実際に1つのテーブルに含める必要があるかどうかは本当にわかりません。

考えは単純だった。 fav(コメントまたは投稿)のIDを取得し、それを同じ名前の列に割り当てます。また、ユーザーのIPアドレスも取得します。つまり、ユーザーが既にアイテムを気に入っているかどうかがわかります。しかし、私の実装が適切かどうかはわかりません(それによって、私は保守しやすくなっています)。

図:

set up a likes diagram for a blog

スキーマ:

CREATE TABLE IF NOT EXISTS `likes_counter` (
  `like_ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `like_type` varchar(10) COLLATE utf8_bin NOT NULL,
  `like_content_ID` bigint(20) NOT NULL,
  `like_IP` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`like_ID`),
  KEY `like_ID` (`like_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;

私はこれが長い記事だったことを知っていますが、私はすでにあなたの答えに感謝します。

3
user101258

チップ:

  • アバターが画像の場合は、BLOBではなくTEXTを使用してください。
  • 各列名の前にテーブル名を付けないでください。それは不必要に乱雑になります。
  • BIGINTが必要になることはほとんどありません。代わりに_INT UNSIGNED_を使用してください(最大または40億)。
  • _PRIMARY KEY_は_UNIQUE key_はKEYです。したがって、PKのインデックスを再作成しないでください。
  • ENUMstatusなどには、typeの使用を検討してください。
  • Postにはarticlecontentの両方がありますか?調子はどう?
  • 文字列として保持する場合、IPアドレスはVARCHAR(39) CHARACTER SET asciiにすることができます。
3
Rick James