質問内容
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は、(プログラム上の何らかの不具合によって不正な値が登録されていた場合)異なったものが取得される可能性があると懸念しています。このような矛盾した値を格納できてしまうということは、データベース設計に問題があるのではないかと考えています。
正しく教科書通りに正規化するならば、どのように設計すべきなのでしょうか。
どうぞよろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/15 14:13