|
10-3
視界的運用
內容:
瞭解視界的產生方法之後,接下來我們用幾個範例來說明視界的運用。
10-3-1
還原資料表的運用
(A)
視界
simple_students
我們用
students 與
classes
兩張資料表來說明資料庫邏輯設計的問題。如下圖所示,原來記錄學生資料只要如同 org_students
表,裡面登錄了該學生在哪一班(class_name),在哪一系(dep_ID)。但班級名稱每年要修改,譬如今年四資三甲,明年就變成四資四甲,所以每年必須變更每一位學生的資料,這樣設計好像不理想。另外,學生可能轉系或轉班,又必須修改
class_name
與 dep_ID,如果僅修改一個地方也是發生錯誤。因此,為了此正規化原則,我們將它拆解成
students 與
classes 兩張資料表,每年只要修改
classes 內的
class_name,則全校學生資料隨之修改。此設計好像不錯,但延伸了新的問題,我們查詢學生資料時,大多以班級大多以代碼表示,但如要顯示班級名稱時,又要結合
classes
表格才能達成。再思考下一個問題,一般處理學生選課事務時,很少用到地址、電子郵件與電話,何不建立一個 view,來回復原來
org_students 的需求就好,如圖中的
simple_students。
在本書
course_db 已建立了此資料表,其結構
{class_ID, student_ID, name, sex},SQL
命令如下:(輸入之前,必須先把原有的刪除)
Create
view simple_students as
Select
B.class_name, A.student_ID, A.name, A.sex
From
students as A, classes as B
Where
A.class_ID = B.class_ID;
|
(B)
視界
simple_teachers
同樣的問題也發生在
teachers 與
department 資料表。如下圖所示,我們將它們回復成
simple_teachers
視界,不但能方便運用,也不會破壞原來的設計原則。
在本書
course_db 已建立了此資料表,其結構
{dep_name, teacher_ID, name},SQL
命令如下:(輸入之前,必須先把原有的刪除)
Create
view simple_teachers as
Select
B.dep_name, A.teacher_ID, A.name
From
teachers as A, department as B
Where
A.dep_ID = B.dep_ID
|
10-3-2
範例研討
-查詢教師授課名冊
(A)
系統功能:Ex10_1
教務處需要一個可查詢教師授課課程的名冊,查詢網頁如下:(可供輸入教師姓名與課程名稱)
執行網頁的結果,如下:
(B) SQL
系統分析
此題目,我們用原資料表做過,現使用
simple_teachers與
simple_students 兩個
view 表格,來處理看看,下圖是資料表關連圖。
將上圖的關連,以
SQL 程式如下:
select
C.class_name, C.student_ID, C.name,
B.final
from
open_course as A,
select_course as B,
simple_students as C
where
A.teacher_ID = ‘$teacher_ID’
and
A.course_ID = ‘$course_ID’
and
A.open_course_ID = B.open_course_ID
and
B.student_ID = C.student_ID; |
(C)
網頁製作技巧
依照上述 SQL
系統分析,網頁設計如下:
(D)
查詢網頁的程式範例:Ex10_1-form.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 |
<?php
$select_db = mysqli_connect("localhost", "root", "12345678", "course_db")
or die("MySQL
伺服器連結失敗
<br>");
//
查詢教師與課程
$sql_query1 = "select teacher_ID, name
from teachers";
$result1 = mysqli_query($select_db, $sql_query1);
$sql_query2 = "select course_ID, course_name
from all_course";
$result2 = mysqli_query($select_db, $sql_query2);
echo
"<p><font size='3'>
查詢教師授課名單與成績
</font></p>";
echo
"<form name='表單'
method='post' action='Ex10_1-action.php'>";
//選擇教師
echo "<select name='teacher_ID'>";
while($row=mysqli_fetch_row($result1)) {
echo "<option value='$row[0]'>
$row[1]($row[0])</option><BR>";
}
echo "</select>";
echo "<BR><BR>";
//選擇授課科目
echo "<select name='course_ID'>";
while($row=mysqli_fetch_row($result2)) {
echo "<option value='$row[0]'>
$row[1]($row[0])</option><BR>";
}
echo "</select>";
echo "<BR><BR>";
echo "<input type='submit' value='送出'>";
echo "</form>";
mysql_close($db_link);
?> |
(E)
處理網頁:Ex10_1-action.php
編寫程式之前,須先建立simple_teachers與
simple_students 兩個
view 表格。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 |
<?php
$teacher_ID = $_POST["teacher_ID"];
$course_ID = $_POST["course_ID"];
$select_db = mysqli_connect("localhost", "root", "12345678", "course_db")
or die("MySQL
伺服器連結失敗
<br>");
//
查詢授課學生與成績
$sql_query
= "select C.class_name, C.student_ID, C.name, B.final
from open_course as A,
select_course as B,
simple_students as C
where A.teacher_ID = '$teacher_ID'
and A.course_ID = '$course_ID'
and A.open_course_ID = B.open_course_ID
and B.student_ID = C.student_ID";
$result = mysqli_query($select_db, $sql_query);
$items = array("班級名稱",
"學號",
"姓名",
"成績");
echo "<table border = '2'><tr align='center'>";
//
利用
foreach
迴圈印出陣列
$item
foreach ($items as $value) {
echo "<td> $value </td>";
}
echo "</tr>";
while($row=mysqli_fetch_row($result)) {
echo "<tr>";
for($j=0; $j<mysqli_num_fields($result); $j++) {
echo "<td>$row[$j]</td>";
}
echo "</tr>";
}
echo "</table>";
mysql_close($db_link);
?> |
|
翻轉工作室:粘添壽
course_db 關聯圖
資料庫程式設計:
翻轉電子書系列:
|