1、把SET remove_time = '1970-01-01 00:00:00' 称为“移除”(remove),

把DELETE FROM table 称为“擦除”(expunge),

至于“删除”(delete)、“取消”(cancel),则更像个业务层而不是持久层的观点。

jspoption宽度Mysql表单设计 HTML

2、数据表可以分为信息表,关联表,字典表。

3、信息表反响的是数据信息,“数据为王”紧张指的便是这类表里的数据。

信息表该当有以下字段

id int 这条数据的主键,默认长度,无符号,自增,前位补零。
由于remove_time的存在,以是业务上的字段做主键便不再得当,由于新插入的数据很有可能与被移除的数据发生主键重复,以是须要一个毫无业务意义的主键

insert_time datetime 这条数据第一次实行insert文的韶光,不能为空。

update_time datetime 这条数据每次实行update文的韶光,可以为空(如果从为被update过,那就该当是空的)。

remove_time datetime 这条数据实行remove文的韶光,可以为空,这个字段有值则代表这条数据被删了,

由于信息表里的数据每每比较主要,以是该当禁止擦除,利用移除。
而“有remove_time字段”和“利用移除”两件事情该当同时涌现,或同时不涌现

信息表可以有以下字段,但不是“该当有”

insert_id int 插入这条数据的业务上的插入者id,代表的是某一个信息表的主键(user表之类的)。

insert_table varchar(64) 如果业务上不但一类插入者,那么须要指定是那个信息表。
长度定为64,由于表名最长64个字符。

update_id int 与insert_id同理。

update_table varchar(64) 与insert_table同理。

remove_id int 与insert_id同理。

remove_table varchar(64) 与insert_table同理。

如果是全体项目在业务上没有登录行为,或是管理员在db上插入/修正的,那么些字段只能为空了,这也是这些字段不算“该当有”的缘故原由了。

一个信息表的示例可能是这样的

CREATE TABLE `person` (

`id` int(11) unsigned zerofill NOT NULL AUTO_INCREMENT,

`name` varchar(20) NOT NULL,

`sex` tinyint(1) DEFAULT NULL,

`birthday` date DEFAULT NULL,

`father_age` int(3) DEFAULT NULL, #这个字段可能非常奇怪,但Deolin只是希望能在示例里有至少一个int字段,并且最好不是age(age跟birthday一起涌现的话显得更加奇怪)

`tuition` decimal(8,2) DEFAULT NULL,

`payment_time` datetime DEFAULT NULL,

`vip_flag` tinyint(1) DEFAULT NULL,

`insert_time` datetime NOT NULL,

`update_time` datetime DEFAULT NULL,

`remove_time` datetime DEFAULT NULL

PRIMARY KEY (`id`)

)

4、关联表反响的是两张信息表之间多对多的关系,例如学生表与课程表之间的关系

除了主键,关联表该当有像信息表那样的根本字段。

至于主键,它的设计有两种办法

第一种

放弃主键id,而是利用被关联表各自的id作为双主键(如student_id, lesson_id),

这种办法优点是直不雅观,一眼就能看出是关联表,而且关联关系绝对不会重复。

有个缺陷,remove_time和移除操作不能有了,由于会发生主键重复,以是只能擦除。

第二种

利用主键id,优缺陷与第一种办法恰好相反。

紧张适用于两种场合,一是全体项目有比较强的数据挖掘和剖析目地的,即便是关联关系也要保留下来,

二是关联关系产生时,会涌现一些业务字段(如学生选的课,会有成绩,那么成绩字段不应该放在student或lesson中,而是该当放在关联表里)

5、字典表反响的是为项目本身供应的各种数据,是对项目扩展性的补充,

(如JSP中option标签的每一个value属性,如某个表'kind'之类字段的值阐明,如一些配置属性),数据量不会很大,

基本上,数据是开拓职员录入,项目不会对它有增、改、移除、擦除操作,只有查询操作,一个不是特殊大的项目只须要一张字典表。

一样平常只有以下字段

key varchar(255) 主键,字典的索引

value varchar(255) 字典的值

group varchar(255) 用来表示key属于那一类,可以为空

sort int 用来表示key在自己所在group的顺序,可以为空

disable tinyint(1) 用来表示这条数据是否被失落效,不能为空,默认0

6、信息表之间一对一的关系,设计成两张表的id字段同等

例如`person`表示例中,每个人都有“学生”和“子女”两个不同模块的属性,可以将它们分别抽取出来

CREATE TABLE `person` (

`id` int(11) unsigned zerofill NOT NULL AUTO_INCREMENT,

`name` varchar(20) NOT NULL,

`sex` tinyint(1) DEFAULT NULL,

`birthday` date DEFAULT NULL,

`vip_flag` tinyint(1) DEFAULT NULL,

`insert_time` datetime NOT NULL,

`update_time` datetime DEFAULT NULL,

`remove_time` datetime DEFAULT NULL,

PRIMARY KEY (`id`) #与其他两张表的id形成逻辑外键

)

CREATE TABLE `student` (

`id` int(11) unsigned zerofill NOT NULL AUTO_INCREMENT,

`tuition` decimal(8,2) DEFAULT NULL,

`payment_time` datetime DEFAULT NULL,

`insert_time` datetime NOT NULL,

`update_time` datetime DEFAULT NULL,

`remove_time` datetime DEFAULT NULL,

PRIMARY KEY (`id`) #与其他两张表的id形成逻辑外键

)

CREATE TABLE `child` (

`id` int(11) unsigned zerofill NOT NULL AUTO_INCREMENT,

`father_age` int(3) DEFAULT NULL,

`father_job` int(3) DEFAULT NULL,

`mother_age` int(3) DEFAULT NULL,

`mother_job` int(3) DEFAULT NULL,

`insert_time` datetime NOT NULL,

`update_time` datetime DEFAULT NULL,

`remove_time` datetime DEFAULT NULL,

PRIMARY KEY (`id`) #与其他两张表的id形成逻辑外键

)

7、信息表之间一对多的关系,在“多”的表中追加一个 `for_表名` 字段(如果其他字段中有单词for,有时候也会设计成`表名_id`)

例如,一家学校当前有多个学生,一个学生当前只能属于一个学校

CREATE TABLE `school` (

`id` int(11) unsigned zerofill NOT NULL AUTO_INCREMENT,

`address` varchar(200) DEFAULT NULL,

`insert_time` datetime NOT NULL,

`update_time` datetime DEFAULT NULL,

`remove_time` datetime DEFAULT NULL,

PRIMARY KEY (`id`)

)

CREATE TABLE `student` (

`id` int(11) unsigned zerofill NOT NULL AUTO_INCREMENT,

`for_school` int(11) NOT NULL DEFAULT '0', #与school.id形成逻辑外键

`name` varchar(20) DEFAULT NULL,

`insert_time` datetime NOT NULL,

`update_time` datetime DEFAULT NULL,

`remove_time` datetime DEFAULT NULL,

PRIMARY KEY (`id`)

)

8、关联表的命名,一样平常是两张“多”的表的表名用2链接

例如一个学生选择多门课程,一门课程供多逻辑学生选择

CREATE TABLE `selectable_lesson` (

`id` int(11) unsigned zerofill NOT NULL AUTO_INCREMENT,

#省略

PRIMARY KEY (`id`)

)

CREATE TABLE `normal_student` (

`id` int(11) unsigned zerofill NOT NULL AUTO_INCREMENT,

#省略

PRIMARY KEY (`id`)

)

CREATE TABLE `normal_student2selectable_lesson` ( #意为normal student to selectable lesson

`id` int(11) unsigned zerofill NOT NULL AUTO_INCREMENT,

`for_normal_student` int(11) NOT NULL DEFAULT '0', #与normal_student.id形成逻辑外键

`for_selectable_lesson` int(11) NOT NULL DEFAULT '0', #与selectable_lesson.id形成逻辑外键

`score` int(3) DEFAULT NULL,

`insert_time` datetime NOT NULL,

`update_time` datetime DEFAULT NULL,

`remove_time` datetime DEFAULT NULL,

PRIMARY KEY (`id`)

)

9、信息表的中字段名中不涌现表名,

如不采取user.username,而是采取user.name

11、信息表中涉及到“属于什么类型”、“是哪种分类”观点的字段,用`kind`表示,如user.kind

涉及到以上观点信息表,用诸如`food_type`来表示。

10、类型

字符串长度不变的用char(n),

字符串能大致确定范围的用varchar(n),

字符串范围超过65532的用text,

年事之类的字段常日用int(n),

上限不定的个数类字段常日用int默认,即最长11,

更永劫用bigint,

日期用date,

日期+韶光用datetime,

韶光用time,

区分类字段(如“性别”,“直辖市”等)用tiny(1)(并在Java代码中定义好规约),

是/否类字段用tiny(1),

价格类字段用decimal(8,2),-99,999,999.99 ~ 99,999,999.99,

电话/手机用varchar(20),

`id`用int,`insert_time`和`update_time`和`remove_time`用datetime