文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>《SQL入门经典》-数据库设计

《SQL入门经典》-数据库设计

时间:2010-10-20  来源:zhangjunhd

《SQL入门经典》 Paul Wilton;John Colby
清华大学出版社
ISBN:7302128332

1.数据库设计的3个范式
1.1 第一范式
-定义所需要的数据项,因为它们将成为表中的列。将相关的数据项放置在一个表中。
-确保没有重复的数据项。
-确保存在一个主键。

1.2 第二范式
符合第一范式,并且要求主键中的任意列必须没有局部相关性。

例如存在一张表:
FilmId      int             PK
FilmName    varchar(100)
ActorId     int             PK
ActorName   varchar(100)
DateOfBirth date

这里存在局部相关,FilmName依赖于FilmId,而ActorName和DateOfBirth依赖于ActorId,所以应该拆分成3张表:
table1
FilmId      int             PK
FilmName    varchar(100)

table2
ActorId     int             PK
ActorName   varchar(100)
DateOfBirth date

table3:
FilmId      int             PK
ActorId     int             PK
表3记录影片和演员的关联。

1.3 第三范式
符合第二范式,并且要求非主键字段不存在传递相关性(即所有的非主键字段都依赖于主键,而不是通过其中某个非主键字段,传递依赖于主键)。

例如一张表:
MemberId    int             PK
FirstName   varchar(30)
LastName    varchar(30)
Zipcode     char(6)
Street      varchar(50)
City        varchar(50)
State       varchar(50)

这里Street,City,State3个字段存在传递相关性,其实它们依赖于Zipcode。所以应该拆分成2张表:
table1
MemberId    int             PK
FirstName   varchar(30)
LastName    varchar(30)

table2
Zipcode     char(6)         PK
Street      varchar(50)
City        varchar(50)
State       varchar(50)

消除传递相关性的好处是,数据重复量降低,不存在数据冗余的情况。坏处是增加了复杂性并降低了效率,数据库将花费更长的时间检索数据。

2.利用约束确保数据有效性
2.1 NOT NULL约束
NOT NULL可以确保列必须具有一个值,否则记录就不能插入到数据库中。

  1. mysql> create table tmp 
  2.     -> ( 
  3.     -> column1 int not null
  4.     -> column2 varchar(20), 
  5.     -> column3 varchar(12) not null 
  6.     -> ); 
  7.  
  8. mysql> alter table tmp modify column2 varchar(20) not null


2.2 UNIQUE约束
UNIQUE约束防止一个特定的列中的两个记录具有相同的值。

  1. mysql> create table myuniquetable 
  2.     -> ( 
  3.     -> column1 int
  4.     -> column2 varchar(20) unique
  5.     -> column3 varchar(30) unique 
  6.     -> ); 
  7.  
  8. mysql> insert into myuniquetable values (1,'abc''xyz'); 
  9. Query OK, 1 row affected (0.00 sec) 
  10.  
  11. mysql> insert into myuniquetable values (1,'efg''xyz'); 
  12. ERROR 1062 (23000): Duplicate entry 'xyz' for key 'column3' 


设定组合UNIQUE:

  1. mysql> create table myuniquetable2 
  2.     -> ( 
  3.     -> column1 int
  4.     -> column2 varchar(20), 
  5.     -> column3 varchar(20), 
  6.     -> constraint myuniqueconstraint unique (column2,column3) 
  7.     -> ); 
  8.  
  9. mysql> insert into myuniquetable2 values (1,'abc''xyz'); 
  10. Query OK, 1 row affected (0.00 sec) 
  11.  
  12. mysql> insert into myuniquetable2 values (1,'efg''xyz'); 
  13. Query OK, 1 row affected (0.00 sec) 
  14.  
  15. mysql> insert into myuniquetable2 values (1,'abc''uvw'); 
  16. Query OK, 1 row affected (0.00 sec) 
  17.  
  18. mysql> insert into myuniquetable2 values (1,'abc''xyz'); 
  19. ERROR 1062 (23000): Duplicate entry 'abc-xyz' for key 'myuniqueconstriant' 


可以设置多个约束:

  1. mysql> create table myuniquetable2 
  2.     -> ( 
  3.     -> column1 int
  4.     -> column2 varchar(20), 
  5.     -> column3 varchar(20), 
  6.     -> constraint myuniqueconstraint1 unique (column2,column3), 
  7.     -> constraint myuniqueconstraint2 unique (column1,column3) 
  8.     -> ); 


更改和删除约束:

  1. mysql> alter table myuniquetable2 add constraint myuniqueconstraint3 unique (column2,column3); 
  2. mysql> alter table myuniquetable2 drop index myuniqueconstraint3; 


2.3 CHECK约束
CHECK约束检查输入的记录的值是否满足一个条件。如果条件为假,则该记录不被输入到表中。

  1. mysql> create table nameage 
  2.     -> ( 
  3.     -> name varchar(30), 
  4.     -> age int check (age>=0) 
  5.     -> ); 


注,在mysql中check约束不起作用。

2.4 主键约束
每个表都需要主键,主键提供了表之间的链接。主键 = UNIQUE + NOT NULL

  1. mysql> create table booking 
  2.     -> ( 
  3.     -> customerId int primary key
  4.     -> bookingId int
  5.     -> destination varchar(30) 
  6.     -> ); 


2.5 外键约束
外键是访问另外一个表中的主键的列。主键和外键创建了不同表中数据的相互关系。

在mysql中,需要体现外键约束,必须使用InnoDB,而模式应该是MyISAM。需要更改引擎。

  1. mysql> create table record 
  2.     -> ( 
  3.     -> bookingId int primary key
  4.     -> checkin date 
  5.     -> ); 
  6.  
  7. mysql> alter table booking type =InnoDB; 
  8. mysql> alter table record type =InnoDB; 
  9.  
  10. mysql> alter table booking add constraint booking_pk foreign key (bookingId) references record(bookingId); 
  11.  
  12. mysql> insert into booking values (1,1,'beijing'); 
  13. ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`filmClub`.`booking`, CONSTRAINT `booking_pk` FOREIGN KEY (`bookingId`) REFERENCES `record` (`bookingId`)) 


由于在record表中没有主键值为1的记录,所以在booking表中无法插入这条记录。这就是外键约束。

3.利用索引加速结果查询

添加与删除索引

  1. CREATE INDEX index_name ON table_name column_names 
  2. ALTER TABLE table_name DROP INDEX index_name 
  3.  
  4. mysql> use filmClub; 
  5. mysql> select FirstName,LastName from MemberDetails; 
  6. +-----------+----------+ 
  7. | FirstName | LastName | 
  8. +-----------+----------+ 
  9. | Katie     | Smith    | 
  10. | Sandra    | Jakes    | 
  11. | Steve     | Gee      | 
  12. | John      | Jones    | 
  13. | Jenny     | Jones    | 
  14. +-----------+----------+ 
  15.  
  16. mysql> create index member_name_index on MemberDetails(FirstName,LastName); 


此时再进行查询,发现记录已经排序(默认升序)。

  1. mysql> select FirstName,LastName from MemberDetails; 
  2. +-----------+----------+ 
  3. | FirstName | LastName | 
  4. +-----------+----------+ 
  5. | Jenny     | Jones    | 
  6. | John      | Jones    | 
  7. | Katie     | Smith    | 
  8. | Sandra    | Jakes    | 
  9. | Steve     | Gee      | 
  10. +-----------+----------+ 
  11.  
  12. mysql> alter table MemberDetails drop index member_name_index; 


下面的语句创建一个唯一索引,它先根据姓的降序排序,再根据名排序。

  1. mysql> create unique index member_name_index on MemberDetails (LastName desc, FirstName); 
  2.  
  3. mysql> select FirstName,LastName from MemberDetails; 
  4. +-----------+----------+ 
  5. | FirstName | LastName | 
  6. +-----------+----------+ 
  7. | Steve     | Gee      | 
  8. | Sandra    | Jakes    | 
  9. | Jenny     | Jones    | 
  10. | John      | Jones    | 
  11. | Katie     | Smith    | 
  12. +-----------+----------+ 


unique确保LastName + FirstName组合唯一。

示例数据库见 http://zhangjunhd.blog.51cto.com/113473/55150

排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载