質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

252閲覧

【テーブル設計】タグに公式と非公式があり、非公式タグは検索に使わないならテーブル不要か?

colette

総合スコア15

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/06/22 06:02

ご質問したいこと

ユーザーが記事投稿する際、「#赤い ケーキと #甘い コーヒー」というタイトルを投稿します。

「赤い」は公式タグで、「甘い」は非公式です。

そして
・公式タグしか検索対象ではない
・非公式タグも記事ページで表示する
のですが、このような場合のテーブル設計として、非公式タグのテーブルは不要(記事テーブルに非公式タグのカラムを持たせれば平気)だと思いますか?

発生している問題

非公式タグのテーブルは不要かどうかがわかりません。

該当のソースコード(非公式タグのテーブルは作らない)

まず公式タグのテーブルだけを作った場合としてこのような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テーブルは作らない方がいいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

実装方法に正解なんてないけど

そして

・公式タグしか検索対象ではない
・非公式タグも記事ページで表示する
のですが、このような場合のテーブル設計として、非公式タグのテーブルは不要(記事テーブルに非公式タグのカラムを持たせれば平気)だと思いますか?

エンティティとして「タグ」という要素が設計上抽出できるのであれば、公式か非公式かでテーブルを用意する/しないが別れるのは違和感。

あくまで「タグ」の種類として「公式/非公式」という属性があるというのなら、同じテーブルに入れて属性値で公式か否かを判断しても良いんじゃないですかね。

まぁ使う側の事情に合わせてテーブルを分離するぐらいは良いかなとも思いますが、「タグ」という要素が別エンティティの属性だったり、独立したエンティティだったりと扱いがバラバラだと、後から見たら設計の意図がわかりづらそう。

投稿2020/06/22 06:28

gentaro

総合スコア8949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

colette

2020/06/22 09:41

ありがとうございます。同じテーブルで属性にしたいと思います。 少し心配なのがディスク容量の件ですが、やはり同じでしょうか?
guest

0

細かく見ていませんが、なにかアプローチが違う感じです。

先ずタグがあり、その属性として公式/非公式がある、というように考えるのが自然ではないでしょうか?

非公式タグというカラムを作ってしまうと、公式/非公式の切り替えを考えると面倒では無いでしょうか。

投稿2020/06/22 06:24

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問