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')));
困了,先写这些把。