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

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

新規登録して質問してみよう
ただいま回答率
85.48%
データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

2回答

2960閲覧

ER図において上位概念の項目の導出経路が複数できてしまうようなRDB設計は正しいか

akadashi

総合スコア19

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

1グッド

3クリップ

投稿2020/03/12 20:34

質問内容

RDBにおいて「テーブルA:テーブルB = 1:多」というリレーションがある場合には、テーブルBからテーブルAの内容を一意に取得できると思います。

ここで、たとえば以下のようなリレーションがある場合、テーブルDからテーブルAの内容を取得できると思いますが、その導出経路としては(テーブルD)-(テーブルB)-(テーブルA)と(テーブルD)-(テーブルC)-(テーブルA)の2通りがあります。

  • テーブルA:テーブルB = 1:多
  • テーブルA:テーブルC = 1:多
  • テーブルB:テーブルD = 1:多
  • テーブルC:テーブルD = 1:多

(テーブルB)が保持している(テーブルA)のキーと(テーブルC)が保持している(テーブルA)のキーとが矛盾していた場合というのも想定できるので、このデータベースは正規化が不十分であるとみなされる気がするのですが、このようなRDB設計は正しいのでしょうか。

もし正しくない場合、どのように改善すべきなのかご指南いただくことは可能でしょうか。

具体例

「学生がweb講義に出席し、講義中の課題に取り組んで提出する」というケースを考えるとします。
以下の箇条書きに示す要件(太字はテーブル名)にしたがって、ER図を作成すると下図のようになりました。

  • 1人の学生は同時に同じ講義に出席することはできないが、出席状態を退席にすると、新たに同じ講義に出席できる(何周も出席できる)
  • 課題講義ごとに特製されたものであり、複数の講義間で共有はしない
  • 設問課題ごとに特製されたものであり、複数の課題間で共有はしない
  • 学生講義に出席せずして提出物を既読状態にすることはできない
  • 学生提出物を既読状態にせずして回答を作成することはできない
  • 学生提出物を既読状態にせずして出席状態を退席にすることができる
  • 学生回答を作成せずして提出物を提出することができる
  • 出席はどの講義に対するものかを特定できる必要がある(出席レコードから講義IDを得たい)
  • 提出物はどの講義のどの課題に対するものかを特定できる必要がある(提出物レコードから講義IDと課題IDを得たい)
  • 回答はどの講義のどの課題のどの設問に対するものかを特定できる必要がある(回答レコードから講義IDと課題IDと設問IDを得たい)
  • 提出物の提出や回答の作成は、何周目の出席の際になされたものかを特定できる必要がある
  • 一度作成したデータは削除しない

イメージ説明

このようなデータベースを設計すると、回答レコードから講義IDを得ようとしたときに、下記3通りの導出経路があります。

  • (回答)-(設問)-(課題)-(講義)
  • (回答)-(提出物)-(課題)-(講義)
  • (回答)-(提出物)-(出席)-(講義)

この場合、各経由で導出された講義IDは、(プログラム上の何らかの不具合によって不正な値が登録されていた場合)異なったものが取得される可能性があると懸念しています。このような矛盾した値を格納できてしまうということは、データベース設計に問題があるのではないかと考えています。
正しく教科書通りに正規化するならば、どのように設計すべきなのでしょうか。

どうぞよろしくお願いいたします。

s.k👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

(テーブルB)が保持している(テーブルA)のキーと(テーブルC)が保持している(テーブルA)のキーとが矛盾していた場合というのも想定できるので、このデータベースは正規化が不十分であるとみなされる気がするのですが、このようなRDB設計は正しいのでしょうか。

このような設計が正しい場合もありえます。テーブルBを経由するリレーションとテーブルCを経由するリレーションで意味が違う場合には、もちろん別々に持たせる必要があります。

投稿2020/03/12 22:37

maisumakun

総合スコア145184

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

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

akadashi

2020/03/15 14:13

両者は常に同じになることを前提としている(この前提が崩れるような仕様変更は現実に発生しない)ため、その場合にはこのような設計もありえるという結論を理解の落とし所としたいと思います。 ありがとうございました。
guest

0

以下の箇条書きに示す要件(太字はテーブル名)にしたがって、ER図を作成すると下図のようになりました。

先ずはここを見直して下さい。
経路が冗長になっています。

そうなっている理由の一つとしては「学生」の扱いです。
一つのエンティティから複数のエンティティへのリレーションがあっても良いのです。
リレーションが循環しないように考えてみて下さい。

補足で例示します。
例えば、以下の制約がなくなった場合、ER図に不整合が生じます。
出席はどの講義に対するものかを特定できる必要がある(出席レコードから講義IDを得たい)

投稿2020/03/13 02:52

編集2020/03/13 07:53
sazi

総合スコア25195

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

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

akadashi

2020/03/13 21:30 編集

ご回答ありがとうございます。 以下のような修正を現在のER図に加えた場合を考えてみました。 まず、以下のように右側の各マスタが学生と直接中間テーブルを持つようにします。 学生ー出席ー講義 学生ー提出物ー課題 学生ー回答ー設問 一方、現在縦方向でつながっている以下の関係は断ちます。 出席 | 提出物 | 回答 ここまでにおいて、以下のようなER図が作成されます。     科     | |ー出ー講 |   | 学ー提ー課 |   | |ー回ー設 ここで「提出物の提出や回答の作成は、何周目の出席の際になされたものかを特定できる必要がある」という要件を実現したいのですが、どこに何の情報を保持すればよいのでしょうか。(原案では出席に「何周目」というカラムを持っており、それを参照することによって特定可能な形にしていました) お知恵をお貸しいただきたく、どうぞよろしくお願いいたします。
sazi

2020/03/14 01:43

学生を辿ることに対しての冗長性は、学生からのリレーションを設定する事で解消されます。 一方で出席に関するリレーションは原案のままで良いと思いますが、実際の設計では正規化を緩めて、提出物に「何周目」を項目として持つ気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問