1 Relational Student Enrollment Database
students
sid |
lname |
fname |
class |
telephone |
1 |
Jones |
Allan |
2 |
555-1234 |
2 |
Smith |
John |
3 |
555-4321 |
3 |
Brown |
Harry |
2 |
555-1122 |
5 |
White |
Edward |
3 |
555-3344 |
courses
cno |
cname |
croom |
time |
101 |
French I |
2-104 |
MW2 |
102 |
French II |
2-113 |
MW3 |
105 |
French III |
3-105 |
MW2 |
108 |
Calculus |
2-113 |
MW4 |
enrollment
sid |
cno |
major |
1 |
101 |
No |
1 |
108 |
Yes |
2 |
105 |
No |
3 |
101 |
Yes |
3 |
108 |
No |
5 |
102 |
No |
5 |
105 |
No |
这种就是一般的关系型数据库(Relation Database)
另一种:
Object-Relational Database Example
students
sid |
name |
class |
telephone |
enrollment |
||
|
lname |
fname |
|
|
cno |
major |
1 |
Jones |
Allan |
2 |
555-1234 |
101 |
No |
108 |
Yes |
|||||
2 |
Smith |
John |
3 |
555-4321 |
105 |
No |
3 |
Brown |
Harry |
2 |
555-1122 |
101 |
Yes |
108 |
No |
|||||
4 |
White |
Edward |
3 |
555-3344 |
102 |
No |
105 |
No |
courses
cno |
cname |
croom |
time |
101 |
French I |
2-104 |
MW2 |
102 |
French II |
2-113 |
MW3 |
105 |
French III |
3-105 |
MW2 |
这就是面向对象的关系型数据库(Object-Relational Database0
发现有什么相同点和不同点了吗?其实很容易看出,这两个数据库的资料是一样的,只是结构有一些不一样,后者把students表和enrollment表合并了。为什么会有这样的不同呢?
其实是由于关系型数据库(Relation Database)有First Normal Form Rule:在关系型数据库中,标的一列只能保存单一的,非结构化的值。
这个非结构化又要怎么理解呢?就是我们不能像C语言的结构,C#的类那样创建一个表(比如说name列不能有两个部分name.lname和name.fname)
那么我非要结构化会怎么样呢?那就变成了我们的面向对象的关系型数据库(Object-Relational Database)。看一下面向对象的关系型数据库的students表不就把我们刚才rule甩在一边了嘛:)
那既然有了这两种数据库模型,我们的SQL语言能不能处理两种呢?其实我们的标准SQL,Core SQL-99,并不被所有数据库产品所采用,不过我们大多数数据库产品都支持了一种基本SQL语法,但是高级的SQL语法却未被广泛采用。怎么跑题了,不好意思,这还没跟我们的面向对象的关系型数据库挂上钩呢,处理这种数据库的SQL其实叫做ORSQL,但是各种不同产品(ORACLE,DB2等)对ORSQL这种SQL的延伸都有不同的语法(汗~,那要用不同的数据库,不是很辛苦)。
写个例子吧:
对于前者
SQL:insert into students values (6,Freen,John,1,555-1133);
对于后者:
SQL:insert into students values(6,Green,John,1,555-1133,set(row(101,'No'),row(108,'Yes')));
困了,先写这些把。