私は現在、ユーザーが複数のカテゴリを1つの投稿に割り当てることができるカスタムcmsに取り組んでいます。私の質問は次のとおりです。
- このための正しいmysqlテーブルスキーマは何ですか?
- 選択した複数のカテゴリをブログ投稿テーブルにどのように保存しますか?
ご不明な点がございましたら、お気軽にお問い合わせください。
ここにあるのは多対多の関係です。関係を格納する標準的な方法は、カテゴリと投稿に結合テーブルを使用することです。そのテーブルには、カテゴリIDと投稿IDのみが含まれます。
投稿テーブルには、カテゴリ自体に関する情報はありません。
これに対する正しい mysql テーブル スキーマは何ですか?
1 つの方法は、関係テーブルを作成することです。
CREATE TABLE cms.Posts (
PostID SERIAL,
PostContent TEXT,
PRIMARY KEY (PostID)
) Engine=InnoDB;
CREATE TABLE cms.Categories (
CategoryID SERIAL,
CategoryName VARCHAR(20),
PRIMARY KEY (CategoryID)
) Engine=InnoDB;
CREATE TABLE cms.PostCategories (
PostID BIGINT UNSIGNED NOT NULL,
CategoryID BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (PostID, CategoryID),
FOREIGN KEY (PostID) REFERENCES cms.Posts (PostID),
FOREIGN KEY (CategoryID) REFERENCES cms.Categories (CategoryID)
) Engine=InnoDB;
選択した複数のカテゴリをブログ投稿テーブルにどのように保存しますか?
そうではありません。それらをPostCategories
テーブルに保存します。
$dbh = new PDO('mysql:charset=utf8', $username, $password);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh->prepare('INSERT INTO cms.Posts (PostContent) VALUES (?)')
->execute([$_POST['content']]);
$qry = $dbh->prepare('
INSERT INTO cms.PostCategories (PostID, CategoryID) VALUES (?, ?)
');
$qry->bindValue(1, $dbh->lastInsertId());
$qry->bindParam(2, $category);
foreach ($_POST['categories'] as $category) $qry->execute();
誰もが(私を含めて)使用していると思われる解決策は、@rwilliamsが説明したものです。これらは、クエリが単一のタグに制限されている場合にうまく機能します。2つのタグ(個人用としてタグ付けされ、旅行としてタグ付けされている)をクエリするには、結合を使用する必要があります。クエリがより複雑になると、これは機能しなくなります。MongoDBは私が思うより良い解決策でしょう。
多対多の関係では、テーブルを次のように設計できます
caegory table
categoryId categorydescription
post table
postid postText
a third table to link them
categoryId postId
blog_posts
==========
id | 23
title | My title
categories
==========
id | 1
name | yogurt
// another row
id | 2
name | motor cycles
category_blog_post
==================
23 | 2
23 | 1
ブログ投稿 My title is tagged as being about yogurt and motor Cycles のエントリを表示しています