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

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

ただいまの
回答率

89.98%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 410

widget11

score 173

以下の様な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に入れる- という処理を書き保存するのも何か腑に落ちません。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

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

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

また、

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/12 09:26

    mts10806さんと被りました。

    キャンセル

  • 2019/03/12 09:58

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

    キャンセル

  • 2019/03/12 12:08

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

    キャンセル

  • 2019/03/12 12:15

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

    キャンセル

+4

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/12 12:05

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

    キャンセル

  • 2019/03/12 12:18

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

    キャンセル

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

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる