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

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

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

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

SQL

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

2回答

1596閲覧

掲示板のDBのリレーションに関する質問です

widget11

総合スコア221

MySQL

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

SQL

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

1グッド

0クリップ

投稿2019/03/11 18:30

以下の様な4つのテーブルがあるとします
細かい理由は置いておいて、前提としてですが、管理者とユーザーのテーブルは分かれており、且つユーザーは掲示板を立てることができないということにします。

ユーザーテーブル
  • id
  • 名前
管理者テーブル
  • id
  • 名前
掲示板テーブル
  • id
  • タイトル
  • 内容
コメントテーブル
  • id
  • 内容
  • 掲示板id(FK)

まず、管理者は多数の掲示板を持ち得る為掲示板と1:Nの関係が成り立つため掲示板の属性に外部キーとして管理者IDを持つことが出来ると思います。

掲示板テーブル
  • id
  • タイトル
  • 内容
  • 管理者id(FK)

コメントテーブルも多数のユーザーの書き込みを持てるので外部キーとしてユーザーidを持ちます。

コメントテーブル
  • id
  • 内容
  • 掲示板id(FK)
  • ユーザーid(fk)

ここで質問なのですが、コメントテーブルに管理者idの外部キーは持つべきなのでしょうか?
それとも外部キーとしては持たないべきなのでしょうか?
つまり形としては

コメントテーブル
  • id
  • 内容
  • 掲示板id(FK)
  • ユーザーid(fk)
  • 管理者id(fk) or 管理者id

のような形となります。
管理者テーブルから見るとコメントテーブルは孫テーブルに当たると思います。
仮に管理者idをFKとするとコメントテーブルは管理者テーブルの子テーブル且つ孫テーブルと、非常に主観的な話ですがなにか気持ち悪い印象を受けます。
ただアプリケーション側で -もしコメントした人が管理者だったら、掲示板テーブルの管理者属性を参照してコメントテーブルの管理者idに入れる- という処理を書き保存するのも何か腑に落ちません。

このようなテーブルがある場合どのようなリレーション設計にすべきなのでしょうか?
よろしくお願い致します。

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答2

0

掲示板テーブルに管理者IDがあるため、
いずれにしてもデータ取得の際は掲示板IDでコメントテーブルを引っ張ってきますよね。
その時に既に管理者は特定できている状況のため、コメントテーブルに管理者IDは不要と思います。

というより、管理者テーブルを廃止し、ユーザーテーブルに権限区分を追加したほうがスッキリするのではないのでしょうか。
つまり突き詰めれば「ユーザーが管理者かどうか分かればいい」ので、そこにフォーカスします。

投稿2019/03/12 00:19

編集2019/03/12 01:01
m.ts10806

総合スコア80842

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

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

widget11

2019/03/12 03:05

ご回答ありがとうございます。 一応ユーザーテーブルにadminフラグ等立ててロール制御するというのは承知の上なのですが、 実は僕が今作成しているアプリケーションのこの管理者テーブルにあたるテーブルは上のユーザーテーブルとは別のユーザーテーブルでして、、、誤解を招いてしまったようですが便宜的にteratailの質問上では管理者テーブルとして質問させて頂きました。ご回答ありがとうございます。
m.ts10806

2019/03/12 03:18

前提条件や背景が抜けると的確な回答になりませんので(無用なやり取りも発生して解決にたどり着きません)、そのあたりは便宜とか関係なく、きちんと状況を書いてください。 見ているほうはみんな赤の他人です。
guest

0

ベストアンサー

そもそもユーザーと管理者を分けるテーブル設計は行いません。
ユーザーテーブルに管理者か一般かの識別を持たせるようにします。
管理者かどうかは、ユーザーに従属するからです。
管理者が権限外された場合とか、ユーザーに管理者権限を付与する場合を考えると、従属関係にしない事による面倒さが分かるでしょう。

次に質問の内容について、コメント別に管理者の権限を与える必要が無いなら、重複は排除するという正規化の前提に従い、コメントにまで管理者IDを持たせる必要は無いと思います。

また、

管理者テーブルから見るとコメントテーブルは孫テーブルに当たると思います。

のように考えません。
ユーザーが決まらないと、掲示板やコメントが作れないという事ではなく、掲示板やコメントに対する属性として、管理者やユーザーがあるという主従の関係です。

投稿2019/03/12 00:23

編集2019/03/12 01:54
sazi

総合スコア25173

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

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

sazi

2019/03/12 00:26

mts10806さんと被りました。
m.ts10806

2019/03/12 00:58

saziさんの回答見て安心しました(考え方合ってた)
widget11

2019/03/12 03:08

ご回答ありがとうございます。mts10806さんに対してと同じような回答となりますが、ユーザーテーブルにadminフラグ等立ててロール制御するというのは承知の上なのですが、 実は僕が今作成しているアプリケーションのこの管理者テーブルにあたるテーブルは上のユーザーテーブルとは別のユーザーテーブル(属性がかなり異なるユーザーテーブル)、、、誤解を招いてしまったようですが便宜的にteratailの質問上では管理者テーブルとして質問させて頂きました。 正規化の観点からもう少し設計を見直してみたいと思います。ありがとうございます。
sazi

2019/03/12 03:15

主従関係はエンティティに絡みますので、具体的な内容での質問にされた方が良いですよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問