ご質問したいこと
ユーザーが記事投稿する際、「#赤い ケーキと #甘い コーヒー」というタイトルを投稿します。
「赤い」は公式タグで、「甘い」は非公式です。
そして
・公式タグしか検索対象ではない
・非公式タグも記事ページで表示する
のですが、このような場合のテーブル設計として、非公式タグのテーブルは不要(記事テーブルに非公式タグのカラムを持たせれば平気)だと思いますか?
発生している問題
非公式タグのテーブルは不要かどうかがわかりません。
該当のソースコード(非公式タグのテーブルは作らない)
まず公式タグのテーブルだけを作った場合としてこのようなCREATEを考えています。
記事テーブルのall_tagsカラムに非公式タグを持たせます。
# 記事テーブル CREATE TABLE IF NOT EXISTS posts ( ID INT(10) AUTO_INCREMENT, title VARCHAR(100), all_tags VARCHAR(100), # 公式タグも非公式タグもここに持たせて表示する PRIMARY KEY (ID) ); # 公式タグテーブル CREATE TABLE IF NOT EXISTS tags ( ID INT(10) AUTO_INCREMENT, tag VARCHAR(10), PRIMARY KEY (ID) );
そして上のテーブルに対し、投稿した場合にINSERTがこうなります。
公式タグである「赤い」だけがtagsに入り、非公式タグはpostsのall_tagsに入ります。
# 記事を挿入 INSERT INTO posts (title,all_tags) VALUES ('#赤い ケーキと #甘い コーヒー','["赤い","甘い"]') ; # 公式タグを挿入 INSERT INTO tags (tag) VALUES ('赤い') ;
該当のソースコード(非公式タグのテーブルを作る)
上に対して、非公式タグのテーブルを作った場合としてこのようなCREATEを考えています。
all_tagsカラムはなくなり、private_tagsテーブルを新たに作ります。
# 記事テーブル ( all_tagsカラムはなくなる ) CREATE TABLE IF NOT EXISTS posts ( ID INT(10) AUTO_INCREMENT, title VARCHAR(100), PRIMARY KEY (ID) ); # 公式タグテーブル ( 変化なし ) CREATE TABLE IF NOT EXISTS tags ( ID INT(10) AUTO_INCREMENT, tag VARCHAR(10), PRIMARY KEY (ID) ); # 非公式タグのテーブル ( 新たに作る ) CREATE TABLE IF NOT EXISTS private_tags ( ID INT(10) AUTO_INCREMENT, tag VARCHAR(10), PRIMARY KEY (ID) );
そして上のテーブルに対し、投稿した場合にINSERTがこうなります。
公式タグである「赤い」だけがtagsに入り、非公式タグはprivate_tagsに入ります。
そしてpostsのall_tagsはなくなるのでINSERTもなくなります。
# 記事を挿入 INSERT INTO posts (title) VALUES ('#赤い ケーキと #甘い コーヒー') ; # 公式タグを挿入 INSERT INTO tags (tag) VALUES ('赤い') ; # 非公式タグを挿入 INSERT INTO private_tags (tag) VALUES ('甘い') ;
後者のprivate_tagsテーブルを作る問題は、「#1」「#2」「#3」、、、のように無限にレコードが増えてしまう点で、それが怖くて前者のように非公式タグはすべてpostsテーブルのall_tagsカラムに持たせることを考えました。
ですがディスク容量としてはprivate_tagsテーブルに持たせようとall_tagsカラムに持たせようと、同じことでしょうか?
どうせ同じならば無限に増えることを怖がらずprivate_tagsテーブルを作った方がいいでしょうか?
それとも、ディスク容量は同じでも何か他の理由によってprivate_tagsテーブルは作らない方がいいでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/22 09:41