- ベストアンサー
日本の国公立中学校の情報管理におけるデータベース設計についての主キーに関する質問
- 日本の国公立中学校で児童達・生徒達の情報を管理するためのデータベース設計について、正規化について知りたいです。
- 提案されたテーブルには学生情報、学校情報、教師情報、クラス情報、試験情報が含まれますが、それぞれのテーブルの主キーが分からなくなってしまいました。
- ご教示いただけると幸いです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
ANo.2,ANo.3,ANo.4に賛成。 http://okwave.jp/qa/q7600713.html の私の回答ANo.2 の最初の段落 (4)クラステーブルとクラス名簿テーブルを分離すべき。 教師というのが,クラス担任・副担任のようにクラスに紐づけられたものなのか, 教師Aはある学生を担当,教師Bは別の学生を担当のように学生に紐づけられたものなのか, によってテーブル設計も主キーも変わります。 (5)試験テーブルと試験受験テーブルを分離すべき。 同一試験だけれどクラスによって実施日が異なる,一部の公欠学生のために同一試験を日程変更して実施した,などのニーズがあります。試験という実体に対しては試験コードを割り当てるのが常套。 (6)教科テーブルと教科担当テーブルを分離すべき。 同一教科を複数の教師が担当することがあります。教科名は教科という実体に紐づけるものであり教科担当講師に紐づける必要はありません。
その他の回答 (5)
- jacob-wk9
- ベストアンサー率36% (85/231)
前質問みたいで書き飛ばします。すいません。 主キー(あるいは重複しないインデックス=unique)と考えれば、分かりやすいでしょうか。 恐らく学生IDは、未来永劫Uniqueだと思います。(私は大学のうん十年前の学生番号を覚えています) まずこれを大基に考えます。 学生ID(学生さん)に関する、複数の情報を持つ場合、これは別のキーを作ってあげます。 さて、Uniqueキーは、必ずしも実際に運用されている番号である必要はありません。 情報対象数にもよりますが、オートナンバーなどを利用する方法もあります。 (1)の学生IDは、 A中学校とB中学校の学生番号が被る場合があります。よって、uniqueではないことが考えられます。 学生に唯一の番号を振る必要があります。 オートナンバーでもいいですし、意味を持たせるなら、文字列にして学校IDがX桁&学生番号がY桁でも良いでしょう。 (1)は、学生ID/氏名/(略)/学校ID/学生番号みたいな感じになります。 (1)と(2)を学校IDでリレーションします。 (2)中学校の学校情報ですね。 (3)これはあとからテストの成績とヒモ付けするための中学教師の担当教科でしょうか。役職と担当教科が別であれば、いちおう担当教科欄も付け足したほうがいいです。そして、教師IDも唯一である必要があります。 オートナンバーでもいいですし、意味を持たせるなら、文字列にして学校IDがX桁&教師番号がY桁でも良いでしょう。 (3)は、教師ID/教師名/担当役職名/(担当教科)/学校IDになります。 (2)と(3)を学校IDでリレーションします。 (4)は学年毎の情報ですね。 性別、学年変わると変わりますかね。今の中学は複雑ですね。特に配慮が不要であれば性別は(1)に。 この場合の教師IDは担任ということで良いでしょうか。 このテーブルはテーブルの一意性の都合上、ユニークなデータがないことから、先頭に割と無意味なオートナンバーIDをつけます。 (4)ID(オートナンバー)/学生ID/年度/学年/クラス/出席番号(そういえば中学ってクラス内の1~40くらいの番号だった)/教師ID (1)-(4)を学生IDでリレーション (3)-(4)を教師IDでリレーション (5)は学生のテストの成績ですね。 (5)にも唯一のキーがありませんから、オートナンバーでIDを振ります。”ScoreID”にしておきますか。 (5)ScoreID(オートナンバー)/学生ID/試験実施日/教科番号/取得点数/(平均点ってなにの?個人全科目?全体?たぶん、場所はここじゃないです) (1)-(5)を学生IDでリレーション (5)-(6)を教科番号でリレーション (6) 教科番号が唯一キーでいいと思います。 ただ、全中学校の「英語I」の成績となった場合は、少し意味合いが変わってきます。「教科名」という文字列でフィルターを掛けるのは、もし記入した文字列にタイプミスがあった場合、統計が取りづらいからです。 (6)教科番号/教科名 これを全中学校共有のマスターテーブルにします。 A中学校の教科番号1番は誰先生が担当しているか。 これは、(5)テーブルに情報持たせるのかなぁ。(5)ScoreID/(略)/教科番号/教師ID/ なんか、わからなくなってきました(笑) 言葉で伝えるのはむずかしいですね。
お礼
(4)の『性別』を(1)の側へと移す正規化の方が比較的に望ましい、 との旨の御指摘を賜りましたので、じっくりと考えさせて頂きました。 但し、当質問の締め切りの後で畏れ入りますが、 其の過程の途上で、私は別の見解に至りました。 そもそも、学生毎の家庭事情の都合で苗字が変わる可能性さえもが御座いますので、(1)の内容は(4)の各キーによって一意の値に絞られ難い、 と私には思われますが、(4)は違う様です。 つまり、もし(4)へと『学期』が追加されましたら、 其の場合には、たとえ転校が有ったとしましても、 『年度』・『学期』・『学生ID』が主キーになって、 『学年』・『クラス』・『(担任)教師ID』・『性別』・『出席番号』が一意に決まりますでしょう。 従いまして、矢張り、 『性別』は(4)のテーブルの属性なのではないでしょうか? 因みに、下記URLのページでも御指導を賜れますと、 非常に助かります。 http://okwave.jp/qa/q7684686.html
補足
有り難う御座います。 転校にも対応させ得るだろうと予想しまして、 『出席番号』の他に、一意の『学生ID』を準備したつもりでいました。 でも、3年間に渡って同じ学校に同じ生徒が留まっている状況が、 日本社会では趨勢を占めていますので、 其の『学生ID』とは違うコードを各生徒達に紐付けませんと、 此のDB設計は簡単に行き詰まるのですね。
- ShowMeHow
- ベストアンサー率28% (1424/5027)
では、言い方を変えてみよう。 (4)を考えるにあたっては、 どの時点で、どの学校にどういうクラスが存在するのか? とそれぞれの生徒がどのクラスにいつからいつまで所属しているのか? を別に考えないと、正規化がうまくできなくなり、メインキーをどうつけたらよいのかはわかりにくくなるのではないでしょうか?
補足
有り難う御座います。 地方自治体全体で分かる通し番号としまして、 生徒IDを割り当ててみたつもりでした。 でも、確かに『学期』を更に追加させませんと、 年度途中での転校を盛り込めませんね。
- FEX2053
- ベストアンサー率37% (7991/21371)
何を管理したいのかはっきりしない気がするんですが? 管理したいものがはっきりしないので、正規化した各DBの 主キーが判らなくなっているんです。 メインになるテーブルは、「最終的に管理したいデータ」に 直結していないと、実際の実行時に効率が悪くなります。
補足
有り難う御座います。 そもそも、最初の時点では、 学生の個人名の絞り込みの為のDBを考えてみたのですが、 重複し得る内容の存在に気付きましたので、 其処への配慮を踏まえた編成を行なっています内に、 収拾が着かなくなって参りました。 此処迄の正規化は不毛なのでしょうか?
- s806099d
- ベストアンサー率34% (17/49)
ちょっとDBの役割が見えないです。 簡単に(1)~(6)のテーブルの名称、何を管理するテーブルかを説明してください。 本来役割が分かっていれば主キーがわからないということはありえないはずです。
補足
有り難う御座います。 又、後で下の枠へも追記を致しますが、 此の質問は次のURLのページからの続きです。 http://okwave.jp/qa/q7679251.html
- ShowMeHow
- ベストアンサー率28% (1424/5027)
素人の私が言うのもなんですが、 インデックスに関してはもう少し、 構造を考え直すしてからにしましょう。 (4)転校にどのように対応するのですか?
お礼
(4)へと『学期』を追加しますと、御指摘の通りに、 『血液型』等のセンシティブ情報さえをも其処へ盛り込める様に、 当該DBが改良されますね。 因みに、次のURLのページに此の話題を発展させましたので、 其処でも御指導を賜れますと、幸甚に存じます。 http://okwave.jp/qa/q7686382.html
補足
有り難う御座います。 そうですね。 但し、現状の私の学習の段階では、 其処迄の余裕が御座いませんでしたから、 畏れ入りますが、今回には、 此処迄の内容での御容赦を賜れますと、助かります。
補足
有り難う御座います。 主題に即した回答に感謝を致します。