ブログ用のデータベースを構築しました。私はまだ学生なので、この分野の知識は限られています。私はこの質問を投稿して、私が何を間違っているのか、なぜ、どのようにそれを修正できるのかについて簡単に説明します。私はバックエンドの開発者ではないので、この投稿から何かを誤解した場合は、さらに説明します。
これはシンプルなブログプロジェクトです。次の手順は、管理者とユーザーが使用できます。
[〜#〜] admin [〜#〜]
[〜#〜]ユーザー[〜#〜]
以下は、上記の手順で使用するテーブルです。
1対多の関係を使用してauthorsとpostsテーブル。各著者は多くの投稿を書くことができ、すべての投稿には1人の著者が必要です。
EER図は以下のとおりです。
authorsとpostsテーブルスキーマの両方を次に示します。
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 ;
どのように関係を作成する必要がありますか?
下は図です:
そしてテーブルスキーマ:
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 ;
これに関する私の主な懸念は、どの投稿がどのコメントを保持しているかをどのようにして知るかです。現在の投稿の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を持つ記事にはコメントがないため、行は登録されていません。 多対多の関係のようですが、正確ではありません。正しいフォームを使用していますか?
これは私が取った最も難しい決定でした。
これらすべてを実際に1つのテーブルに含める必要があるかどうかは本当にわかりません。
考えは単純だった。 fav(コメントまたは投稿)のIDを取得し、それを同じ名前の列に割り当てます。また、ユーザーのIPアドレスも取得します。つまり、ユーザーが既にアイテムを気に入っているかどうかがわかります。しかし、私の実装が適切かどうかはわかりません(それによって、私は保守しやすくなっています)。
図:
スキーマ:
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 ;
私はこれが長い記事だったことを知っていますが、私はすでにあなたの答えに感謝します。
チップ:
BLOB
ではなくTEXT
を使用してください。BIGINT
が必要になることはほとんどありません。代わりに_INT UNSIGNED
_を使用してください(最大または40億)。PRIMARY KEY
_は_UNIQUE key
_はKEY
です。したがって、PKのインデックスを再作成しないでください。ENUM
やstatus
などには、type
の使用を検討してください。Post
にはarticle
とcontent
の両方がありますか?調子はどう?VARCHAR(39) CHARACTER SET ascii
にすることができます。