2010-08-28 38 views
3

比方說你有4種類型的評估,測試,測驗,MiniQuiz和FinalExamMysql在where子句中與字符串相比使用數字更快嗎?

,我們在數據庫中存儲的記錄,像這樣

 
studentid ----- assesType 
1    test 
2    quiz 
3    quiz 
4    quiz 
5    miniquiz 
6    miniquiz 
7    final 
8    final 

是更快,更好的方法來編號分配給各型可以說:

測試= 1個 測驗= 2 miniquiz = 3 最終= 4

,並使用此而不是爲REC或保持。

 
studentid ----- assesType 
1    1 
2    2 
3    2 
4    2 
5    3 
6    3 
7    4 
8    5 

我真的很想問,這是值得嗎?優點等?因爲在執行此操作時,以服務器端語言編寫代碼變得有點困難。

謝謝=)

回答

2

是,數字比較比字符串比較快。字符串也需要更多的空間,數據重複意味着如果你必須重命名「miniquiz」爲「microquiz」,你必須更新所有的行。最後,也可能是最重要的一點,你的數據庫將無法拒絕不可接受的字符串:你說有四種類型的評估,但是你的數據庫會高興地接受你傳遞的任何字符串。

一般而言,您希望創建另一個表,可能會調用它assesTypes,只有idname字段,並保留所有可接受的類型。然後在主表中,使assesType字段爲foreign key,該字段引用新表assesTypesid屬性。例如:

CREATE TABLE assesTypes (
    id int, 
    name varchar(15), 
    PRIMARY KEY (id) 
) ENGINE=INNODB; 

CREATE TABLE assessments (
    student_id int, 
    assesType  int, 
    mark   int, 
    PRIMARY KEY (student_id, assesType), 
    FOREIGN KEY (assesType) REFERENCES assesTypes (id) 
) ENGINE=INNODB; 

現在我們可以填寫我們的assesTypes表:

INSERT INTO assesTypes VALUES (1, 'Test'); 
INSERT INTO assesTypes VALUES (2, 'Quiz'); 
INSERT INTO assesTypes VALUES (3, 'MiniQuiz'); 
INSERT INTO assesTypes VALUES (4, 'FinalExam'); 

現在讓我們插入一些評估數據爲assessments表:

INSERT INTO assessments VALUES (1, 1, 55); 
INSERT INTO assessments VALUES (1, 2, 65); 
INSERT INTO assessments VALUES (1, 3, 75); 

這一切都很好。現在,我們可以INNER JOINassessments表與assessTypes表是這樣的:

SELECT a.student_id, at.name, a.mark 
FROM assessments a 
JOIN assesTypes at ON (at.id = a.assesType); 

對於這個結果:

+------------+----------+------+ 
| student_id | name  | mark | 
+------------+----------+------+ 
|   1 | Test  | 55 | 
|   1 | Quiz  | 65 | 
|   1 | MiniQuiz | 75 | 
+------------+----------+------+ 
3 rows in set (0.00 sec) 

現在,讓我們嘗試在assessments表中插入無效assesType

INSERT INTO assessments VALUES (1, 5, 75); 

我們不能。 MySQL會報告:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails 

外鍵不需要有一個工作的關係型數據庫,但他們必須避免關係破裂和孤兒行(即referential integrity)。要求在ACID中的C能夠在數據庫級別強制執行參照完整性。

+0

嗯謝謝你的回答,請你詳細說明你的意思是「你的數據庫會高興地接受你傳遞的任何字符串。」爲什麼這不適用於數字? – 2010-08-28 08:00:42

+0

@Akay:讓我用一個例子更新我的答案。 – 2010-08-28 08:06:03

+0

噢好吧,我明白了..如果列設置爲varchar(15)..它會接受任何可以是15個字符串,包括數字,=)感謝您的幫助希望這就是你的意思。 – 2010-08-28 08:11:28

2

是的,這是更有效使用數字,那就是標準的約定。

SQL和關係數據庫是爲這種存儲構建的。

例如:

select students.studentid, assessments.assesName AS assesType 
from students 
    inner join assessments on (students.assesType = assesments.assesType) 
0

您應該使用第二種方法。主要優點不在於性能,而在於數據的可維護性。

通過將assesType存儲在單獨的表格中,並通過ID引用該表格,您確定沒有針對不同的assesTypes獲得不同的拼寫,可以輕鬆地重命名assesType而無需更新整個數據庫。您還可以獲得單獨維護assesTypes的好處,您不能在將學生分配給assesType時意外創建新的assesType。在GUI中爲可用的assesTypes創建列表時,您也可以通過快速的方式詢問您有什麼樣的assesTypes。

有關如何構建數據的更多「規則」,您可以查看database normalization

相關問題