1

データベースの設計と SQL に関する知識はほとんどありません。プログラミングとデータベースを学習するための簡単な学生スコア マネージャーを作成しましたが、設計がひどいものでした。

データベース構造

私のデータベースには 3 つのテーブルがあります。

  1. 学生情報
  2. ログ

最初に話しましょうstudent_info。このテーブル構造は次のようになります。

id  student_name    group    the_score_for_1_week    the_score_for_2_week
1   Adam            2        24                      2

フィールドの数は不明です。

logs獲物は乱雑です:

id  date    student_name    score   change  week
1   01-01   Adam            2       2       1
2   01-02   Adam            1       -1      1
2   01-02   Adam            24      23      1

テーブルweekには 1 つのフィールドしかありません。

week
2

プログラム

データベースの構造を示した後。私のプログラムがどのように機能するかを話します。

どのように見えますか?

プログラムには、2 つのグリッド、1 つのグラフ、3 つのボタンがあります。最初のグリッドは、生徒の名前とスコア用です。2 番目のグリッドはログ用で、スコアがどのように変化したかを確認できます。グラフは、スコアの変化を示すためのものでもあります。これが私の最初の設計図です。

設計図

ユーザーのマウスが最初のグラフで生徒の名前をクリックすると、2 番目のグラフにこの生徒のスコアのログが表示され、グラフにはこの生徒のスコアの折れ線グラフが表示されます。

プログラムは、異なる週の異なるスコアを保存できます。Last Weekそのため、 、Next Week、 の3 つのボタンがありますNew Week最新の週のみ編集できます。

それはどのように機能しますか

プログラムが開始されると、 から最新の週が選択されますweek

SELECT week FROM week

次にstudent_name、 、group、 から最新の週student_infoを選択します。生徒の点数を加減することができます。

"SELECT student_name,the_score_for_%s_week,group FROM student_info" % (week)

スコアが変更された後、レコードがlogsテーブルに挿入されます。

"INSERT INTO log(change,score,date,student_name,week) VALUES ("
                 "'%s', '%s', '%s', '%s', '%s')" % (
                 newScore - oldScore, newScore,
                 time.strftime("%m-%d", time.localtime()),
                 student, week))

新しい週が始まると、新しいフィールドthe_score_for_%d_weekが に挿入されます。テーブルstudent_infoも更新する必要があります。week

"ALTER TABLE student_info ADD the_score_for_%s_week,group INTEGER DEFAULT 0" % week
"UPDATE student_info SET the_score_for_%s_week,group=0" % week)
"UPDATE week SET week =%s" % week

ユーザーが生徒の名前をクリックすると、2 番目のグリッドに過去のスコアが表示されます。

 "SELECT date,change FROM log WHERE the_score_for_%s_week=%s and student_name='%s'" % (week, student)

チャートは、スコアがどのように変化するかを示します。2 番目のグリッドとは異なり、グラフを描画するには +1 や -1 ではなく、フル スコアが必要です。

"SELECT score FROM log WHERE the_score_for_%s_week=%s and student_name='%s'" % (week, student))

ご覧のとおり、データベースの設計はひどいものです。StackOverFlowがコード レビュー Web サイトではないことは 知っています。しかし、私はあなたにもっと詳細を伝えたいだけです。データベースの構造を何度も改善しようとしましたが、それについてはわかりません。

最後に、この非常に長い質問を読んでくれてありがとう。

4

2 に答える 2

0

学生情報テーブルからスコアを取り出して、別のテーブルに入れることをお勧めします。これらの詳細をその場で確認できるため、これにより LOG テーブルの必要性がなくなる可能性があります。

Student_Info には次のものが含まれます。

ID
Name
Group

新しいテーブル Result_Details には次が含まれます。

ID
Date
Student_Info_ID
Score

新しい週が始まると、毎週の Student_Info に新しい列を追加するのではなく、Result_Details に新しい行として詳細を入力できます。

次に、学生のスコアのリストを取得するには、次のようなものを使用できます。

select SI.Name, RD.Date, RD.Score 
from Student_Info as SI 
Join Result_Details RD on RD.Student_Info_ID = SI.ID
Where SI.Name = 'Tom'
于 2012-12-24T10:55:12.090 に答える
0

あなたの質問は、近道の答えを得ようとする学校の宿題プロジェクトではなく、プログラミングの側面について学ぶことを目的として知識を向上させることを目的としていると思います。次のリンクは、私の見解では、SQL とは何かを理解する上でかなり明確です。http://www3.ntu.edu.sg/home/ehchua/programming/sql/Relational_Database_Design.html唯一の警告は、最近では SQL と SQL がないことです。NOSQL データベースは基本的に、正式な行構造がないデータのブロックを優先して、CODD によって作成された行と列の形式が無視されるデータベースです。この 2 つを混同してはなりません。適切な状況では、それぞれが他よりも優れたパフォーマンスを発揮します。

上記の記事が役に立たない場合は、「リレーショナル データベース設計チュートリアル」をグーグルで検索すると役立ちます。簡単に言えば、この問題のステップ 1 は、SQL データベースとは何かを理解することです。他のすべてが続きます....

お役に立てれば

于 2012-12-24T14:01:10.170 に答える