額數據庫是啥呢
數據庫是存儲在計算機上的有組織可共享的大量數據的集合
那么我們應當解決兩個問題
第一怎么存
第二存什么
第三如何取
第四如何更新
那么設計什么樣的數據結構跟實現什么樣的功能是密切相關的
那么看到標題就可以想到是學生選課和學生成績管理
那么最基礎的肯定要有學生,課程,成績
這三種數據對象
如果有大量的數據實例我們都可以分到這幾種數據對象里
那么首先我們要分析學生與課程的關系是選與被選。。
那么這里就有一個基礎的問題了通過學生一個實例我們怎么知道他選了哪些課程呢
圖論里我們知道如果一個學生選了一門課於是我們可以連邊
A[stuid].push_back(courseid)
B[courseid].push_back(stuid)
那么我們每次查一個學生選了哪些課遍歷一遍線性表就ok
這里似乎是不用考慮時間復雜度的數據量小?
這樣存的意思似乎是。。每一個學生編號代表一個表。。然后里面存了一堆課程結構體
然后課程也是這樣。。。相當於表里套表
鏈表。。
在數據庫里該如何處理呢。。
我還沒想到怎么妥善處理
但是我們還有一種解決方法
那就是單獨存一個選課關系表
每一條是課程學生關聯的一個條目。。
但是這樣課程信息就冗余了。。
其實學生和信息都挺冗余的。。
后來問了一下菊苣。。這個存法實際上是正確的。。。
因為你O(n)的空間怎么存的下n^2的圖呢。。
鏈表跟存邊的表還是有區別的。。
鏈表只存一個頭
邊表會重復多個頭
邊表可以雙向遍歷,這是鏈表所不能具備的。。鏈表只能單向。。准確的說是一次比較兩個關鍵字
那么我們的邊表就相當於合並了我剛剛說的那兩個鏈表,我們通過這個邊表來實現快速的存取
那么這個選課關系邊表的主鍵是啥。。能唯一標識一個元祖的東西都可以用來當主鍵。。
顯然這里我們可以讓stuid,courseid來當主鍵,這個有重復就不合理了對吧。。怎么hash出不同的散列值是數據庫的事情了吧
//所以我們就。。把課程單獨抽出來。。每個課程做一個選課表?
關於學生和成績以及課程和成績。。
那么一種思路是說。。我們可以參考選課表的主鍵。。
就是說。。有成績的前提是某個學生選了這個課
那么我們就可以參考這個關系。。那么對於每一個選課關系都可以對應一個成績。。
那么這個成績既是學生的成績又是課程的成績。。
上面選課表我們如果只存stuid,courseid,查到了還要再去學生表和課程表里面再去找
那么我們可以采取多加空間存上學生的一些信息。。和課程的一些信息。。這樣可以減少查找時間
相當於是在用空間換時間。。那么你這樣做的后果是增加空間。。並且每次更新也要實時地更新才行
鏈表存到數據庫里實際上就是把鏈表變成edge pair然后把edges存進去,當然要處理成唯一的
還有一個發現的事實是。。查找路徑一般在數據庫里不用存儲,怎么查和怎么高效查詢是程序員以及數據庫設計之初做的工作?
一般來說要做好的工作是維護好數據的邏輯性?維護好數據之間的關系?
數據庫的重構。。好像還沒有資格考慮。。
那么關於這三者的關系應該是理清了。。。
那么我們還要實現其他的功能。。。
其他要實現的功能我還沒有理清下面我們把他們都打上一遍熟悉一下
不過對於剛才成績那里還是有問題的。。如果說。。這個學生選了課但沒有考試。。那么他的成績是多少呢
如果是0,那么考過也可以是0啊對吧。。有歧義的。。我們還可以另開一個判斷考試狀態的標志位來進行特判
那么對於成績還有問題。。如果說還有添加其他類型的成績。。比如說。。平時成績。。實驗成績。。考試成績
那么對於這種類型的擴展。。由於關系並沒有太大的變化。。基本上我們是可以考慮直接附加在基本成績或者
最終成績的后面
有時候這種業務邏輯的處理可以交給人?比如某成績算多少。。都算哪些成績
=========
我們來分析一下系統管理員的功能(1人)
需求分析里寫了。。這個工作只需要一個人來干
首先他要進行教務管理員的信息維護。。
就是說對於教務管理員所有信息的增刪查改。。包括對於教務管理員用戶名和密碼的修改
因為這個涉及到安全性。。所以。。要考慮特判和權限問題。。畢竟不是所有人都能操作
特判一般放到程序中處理?
而且我們還要設計教務管理員都要有哪些必要信息需要登記
他還要進行對於系所基本信息的增刪查改。。那么上面他說過頂層教學單位是院。。所以說
我們要有一個表來存一共有哪些院。。
然后我們還需要再建立一個表外鍵是院系,表明每個院都有哪些系所。。
有了系所我們還需要再建立一個專業表。。
外鍵是系所。。表明每個系所都有哪些專業。。
有了專業表我們還需要建立一個班級表。。
外鍵是專業。。表明每個專業都有哪些班級
除此之外系統管理員還能修改課程的類別信息。。
而且還能修改自己的密碼
=============
對於教務管理員
教務管理員可以對學生的基本信息進行增刪查改
為了避免教務管理員更改系統管理員的密碼。。可以分開存儲表。。或者特判
教務管理員還能對於教師的基本信息進行增刪查改。。甚至用戶名密碼
策略可以是。。如果確認是教師。。那么我們就取出用戶id。。在用戶表里修改對應id的密碼
他還要求維護開課計划
開課計划維護(課程名、課程編號、課程類別、總學時、學分、開課年級)
那么我們再開一個開課計划表。。那么這個情形就和單獨頭結點的鏈表相似了。。存的是節點而不是邊
開課這個節點和所有課程的連邊
他還要求開課數據的維護。。
開課數據維護(課程編號、任課教師、開課班級、選課人數上限等,需要支持合班功能)
開課數據必然在開課計划中有的前提條件為true的情形下進行?
不太確定。。因為開課計划是常常變化的。。不過這個也是常常變化的。。
外鍵先緩一手
如果說我們再開一個開課數據表。。那么除了儲存課程基本信息。。他還要求支持合班功能。。
合班功能是什么意思呢。。我們枚舉一下題意
第一把這個課程的多個授課班級合並成一個。。
第二僅僅是為了允許一個課程可以有多個授課班級。。
那么無論是哪一種情況我們都需要考慮再開一個鏈表。。存儲開課數據表中的多個授課班級
我們新建一個授課班級表
所以說我們可以開外鍵來存鏈表。。然后動態修改每個課程的授課班級條目就能實現合並班級?
我認為講道理。。我們還是要存多個班級的?
當然我們也可以考慮設計成每個條目是課程-授課班級的邊表來存儲。。這樣也行的吧
最后一個功能他可以修改自己的密碼
=======================
對於學生功能
學生可以查詢他已經選了的課程和他的成績。。不知道沒考試的科目能不能查。。
按理說。。成績是不存在的。。
學生可以查看自己的基本信息
學生可以修改自己的登錄密碼。。
學生可以選課。。那么這個功能就相當於往選課表里面添加元祖
===================
對於教師。。
教師可以更改自己的登錄密碼
教師可以查看開課信息,每個課程的基本信息與選課學生的名單。。這個可以由基本表去生成
成績錄入功能。。。批量地給學生列表來更新或者插入成績。。那么。。我們是需要做成一個列表。。
我們通過選擇課程來唯一標識一群學生
成績導入功能。。。根據學生學號和課程號來更新學生的成績。。
我們可以先在選課表里面找到這個關系。。通過這個關系再去成績表里面去更新這個成績