是,數字比較比字符串比較快。字符串也需要更多的空間,數據重複意味着如果你必須重命名「miniquiz」爲「microquiz」,你必須更新所有的行。最後,也可能是最重要的一點,你的數據庫將無法拒絕不可接受的字符串:你說有四種類型的評估,但是你的數據庫會高興地接受你傳遞的任何字符串。
一般而言,您希望創建另一個表,可能會調用它assesTypes
,只有id
和name
字段,並保留所有可接受的類型。然後在主表中,使assesType
字段爲foreign key,該字段引用新表assesTypes
的id
屬性。例如:
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 JOIN
的assessments
表與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能夠在數據庫級別強制執行參照完整性。
嗯謝謝你的回答,請你詳細說明你的意思是「你的數據庫會高興地接受你傳遞的任何字符串。」爲什麼這不適用於數字? – 2010-08-28 08:00:42
@Akay:讓我用一個例子更新我的答案。 – 2010-08-28 08:06:03
噢好吧,我明白了..如果列設置爲varchar(15)..它會接受任何可以是15個字符串,包括數字,=)感謝您的幫助希望這就是你的意思。 – 2010-08-28 08:11:28