1、把SET remove_time = '1970-01-01 00:00:00' 称为“移除”(remove),
把DELETE FROM table 称为“擦除”(expunge),
至于“删除”(delete)、“取消”(cancel),则更像个业务层而不是持久层的观点。
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