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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

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

Q&A

解決済

1回答

1361閲覧

MySQLを使い掲示板を作成するにあたって、限定公開機能を実装したい

rosest

総合スコア5

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

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

0グッド

0クリップ

投稿2020/04/16 15:11

編集2020/04/16 15:14

前提・実現したいこと

掲示板サイトで限定公開機能を実装しています。
テーブル設計として、限定公開相手の情報を掲示板のテーブルと別にするか同じにするかで悩んでいます。
どちらがいいと思うか、ご意見お聞かせ願えませんでしょうか。

掲示板のテーブルと別にする

別のテーブルにするというのは次のような構成で、postsだけでなくlimitedsも作るということです。

CREATE TABLE posts (`post_id` int, `author_id` int, `publicness` varchar(10), `parent_thread_id` int, `parent_comment_id` int, `kind` varchar(10), `text` varchar(1000), `post_date` datetime) ; INSERT INTO posts (`post_id`, `author_id`, `publicness`, `parent_thread_id`, `parent_comment_id`, `kind`, `text`, `post_date`) VALUES (1, 2, 'limited', 0, 0, 'thread', '掲示板1', '2020-01-01 00:00:00') ,(2, 2, null, 1, 0, 'comment', 'コメント2', '2020-01-02 00:00:00') ,(3, 1, null, 1, 2, 'reply', '返信3', '2020-01-03 00:00:00') ,(4, 3, 'public', 0, 0, 'thread', '掲示板4', '2020-01-04 00:00:00') ,(5, 1, 'limited', 0, 0, 'thread', '掲示板5', '2020-01-05 00:00:00') ,(6, 2, null, 5, 0, 'comment', 'コメント6', '2020-01-06 00:00:00') ,(7, 3, 'folllow', 4, 0, 'thread', '掲示板7', '2020-01-07 00:00:00') ; CREATE TABLE limiteds (`limited_id` int, `thread_id` int, `target_id` int) ; INSERT INTO limiteds (`limited_id`, `thread_id`, `target_id`) VALUES #thread1がuser1547105473に公開されてる (1, 1, 1547105473) #thread5がuser4902045731とuser2305478462に公開されてる ,(2, 5, 4902045731), (3, 5, 2305478462) #もし1つのtureadが1000人に公開される場合 #それだけでここが1000レコードになってしまう ;

上記ですと公開相手が数人ならともかくもし1000人いた場合、掲示板1つのためにlimitedsに1000件のレコードが増えることになる点でとうかと思うのですが、しかしlimitedsのtarget_idにインデックスを貼っておけば「自分に公開されているかどうか」をSELECTするのが早いのではないかと考えています。

掲示板のテーブルと同じにする

他方で同じテーブルにした場合の構成はこうでしょうか。

上でlimitedsという別のテーブルにあった情報をpostsのlimited_idsカラムにぶちこんだ感じです。

ユーザーIDが10桁あり、最大1000人に公開できるので、limited_idsはtext(10000)としています。

CREATE TABLE posts (`post_id` int, `author_id` int, `publicness` varchar(10), `parent_thread_id` int, `parent_comment_id` int, `kind` varchar(10), `text` varchar(1000), `post_date` datetime, `limited_ids` text(10000)) ; INSERT INTO posts (`post_id`, `author_id`, `publicness`, `parent_thread_id`, `parent_comment_id`, `kind`, `text`, `post_date`, `limited_ids`) VALUES (1, 2, 'limited', 0, 0, 'thread', '掲示板1', '2020-01-01 00:00:00', '1547105473') ,(2, 2, null, 1, 0, 'comment', 'コメント2', '2020-01-02 00:00:00', null) ,(3, 1, null, 1, 2, 'reply', '返信3', '2020-01-03 00:00:00', null) ,(4, 3, 'public', 0, 0, 'thread', '掲示板4', '2020-01-04 00:00:00', null) ,(5, 1, 'limited', 0, 0, 'thread', '掲示板5', '2020-01-05 00:00:00', '4902045731|2305478462') ,(6, 2, null, 5, 0, 'comment', 'コメント6', '2020-01-06 00:00:00', null) ,(7, 3, 'folllow', 4, 0, 'thread', '掲示板7', '2020-01-07 00:00:00', null) ;

正規化されているのは前者ですが、後者でも「自分に公開されているかどうか」をSELECTするときはlimited_idsにregexで検索をかければいいですし、

あとは「自分に公開されているすべての掲示板」という条件で取得することはなく、あくまで別の条件で取得した掲示板やコメントに対して、フィルターをかけるイメージで使うのが公開情報なので、そういったことを踏まえると後者でもいいのかなと考えているところです。

掲示板の限定公開機能はよくあるものかと思うので、実務的なご経験談など踏まえてお聞かせ願えましたら幸いです。

ご質問は以上になります。どうぞ宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

現状の要件なら正直どっちでも良いと思いますが、どっちでもいいのであれば正規化しておいた方が追加要件が発生した時に柔軟な対応が可能ですね。

個人的には、第三正規形までは無条件で正規化してそこから明らかに正規化を崩す必要があるところを崩していく という方針で設計するのが楽だと感じています。

上記ですと公開相手が数人ならともかくもし1000人いた場合、掲示板1つのためにlimitedsに1000件のレコードが増えることになる点でとうかと思うのですが、

きちんとインデックスが働けば1000レコードずつ増えたところで検索速度的には困らないので(ディスク容量的には若干不利でしょうが)あんまり問題にはならないと思いますよ。
(パフォーマンス及びディスク容量については想定する最大スレッド数*1000レコードで確認をしてみて下さい。)

ユーザーIDが10桁あり、最大1000人に公開できるので、limited_idsはtext(10000)としています。

重箱の隅ですが、10*1000だと改行なりカンマなりで区切るにしても10000じゃ足りないですね。
複数の値を入れるのであればJSON型にするとかを検討した方が良いことが多いですが、どこまでインデックスが働いてくれるかの仕様確認は必須だと思います。(この辺で苦労するくらいなら正規化した方が楽です)

投稿2020/04/16 18:52

tanat

総合スコア18713

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

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

rosest

2020/04/17 17:48

ありがとうございます!まず正規化してから考えます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問