日期:2014-05-17  浏览次数:20741 次

请教下我这张表格该如何设计,或者增加什么约束条件?
各个表的关系 截图如下 http://115.com/file/be96t8it# (咱论坛啥时候能开放上传图片呢??大家辛苦下到网盘下吧,就一张图)

首先,这个数据库管理教室中的座位

其中 table表,只有一个字段,就是桌子编号,存1-95这95个编号。no自然为主键

student表记录学生信息,分别是姓名(因能保证肯定不会有重名的,所以设置主键),性别,联系方式等等

access表的4个字段是,桌子编号、姓名、预约开始日期,预约结束日期。(桌子编号和姓名共同为主键)

表与表之间的参照关系,图中可以看出

——————————————————————————————

我这个数据库的作用是:要将学生预订座位的信息记录在access表中。

但要保证:

不允许出现同一人预订一张桌子的信息出现多次(目前我这样设计,可以避免这样.因为no和name共同为主码,不允许全相同)

no name srart end
10 张三 2012-5-1 2012-9-1
10 张三 2012-3-2 2012-3-9

而且
不允许在access表中插入这样的非法数据(即,同一张桌子,在某一时刻被多人同时预订)

比如

no name srart end
10 张三 2012-5-1 2012-9-1
10 李四 2012-6-1 2012-6-3


但目前,我这样设计,完全没法控制这种非法情况的出现

另外,我也不知道怎么约束,结束时间必须晚于开始日期


大家可以看看如何设计这几个表,或者提供其他的解决方案也可以。多谢啦


------解决方案--------------------
SQL code

create table [table](
[no] int primary key
)
create table student(
id int primary key,
name varchar(10),
.....
)

create table access(
id int foreign key references student(id),
[no] int foreign key references [table]([no]),
name varchar(20),
srartdate datetime ,
enddate datetime,
--比如说要求开始时间和结束时间差必须是大于五小时
constraint no_name_access primary key([no],name)
)

--这样来吧,至于那个enddate必须大于startdate,你可以写个触发器,或者把enddate作为一个计算列