数据库表设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库表设计
好的数据结构会影响速度。好的数据库表设计会影响数据库操作效率。特别是数据多的时候,如果表的结构不好的话操作的时候条件(where后的内容)会变的非常复杂。
SQL是关系数据库中用到的一种语言。所以,为了简化SQL,表的关系(内部和外部)要尽量设计的合理。
下面有几个可以参照的步骤:
1)找出那个表要描述的东西;
2)列出你想通过这个表得到的相关信息的列表;
3)通过上面的信息列表,将信息划分成一块块小的部分,通过此小块来建表;
比如说:
现在需求是:
1)我需要一个表来管理我的朋友的个人信息;
2)我想要的是:通过名字查到某人的地址,生日和邮箱;
3)将上面的信息划分成一块块分别对应表里的一个字段,所以表可以如下:
姓名住址邮箱生日
但需求可能更细,比如说:生日我想精确到年,这样方便我查询每年里所有的朋友。这样就可以将生日再细分成年月日三个字段。甚至如果要细分的话,地址可以再分国国家,省,市等。当然,这就看你想通过表获得哪些数据,一切设计是为了方便数据库操作。在方便自己的前提下将数据表的字段设计成“原子化”(即不可再细分)。比如说,一个网上商店的数据表,什么路多少号对于它来说就是原子化的数据了,就不用再把什么街多少号分开做为两个字段来存储。但对于一个地产商来说,他希望可以通过街道名,号,等来查,所以地址分成几个字段会更好。
字段的原子化是指一个字段里不要包括多个同类型的值;如:
name interests
jim fishing,football
lilei walking,book
表的原子化是指一个表里不要包括几个储存同类型值的字段;如:
teacher student1 student2 student3
lucy hanmeimei poli lily
jack rose mary simon
这里的student1 student2 student3 就重复了。但上面这两种情况似乎只能选择其中一个,也就是说无法满足绝对的原子化,其实不然.我们可以把这些无法满足原子化的字段另外建一个表,让两个表关联起来.
更合理的表设计会给每条记录加上一个唯一的识别,就是加上主键。
1)将一个表字段设为主键要求在表创建的时候就进行设置。
2) 一个表里被设为主键的字段的值必须是唯一的,也就是说如果一个字段被设为主键,这个表所有的数据列表里这个字段的值不可能有重复的。
3) 被设为主键的字段不能插入空值。
4) 被设为主键的字段的值是不能更改的。
5) 如果字段被设为是自增长的,主键只能设置一个且它必须是主键。如果表中没有自增长的字段,则可以设多个字段为主键.
6) 主键最好是一个和表里数据无关的值。比如说另建一个字段:id;而不要设在:name 等这些字段上。
前面提到了两个表关联.两个表之间数据的关系有三种:
1)一对一;两个表里数据唯一对应;
2)一对多;表A在表B里对应多条数据,但表B里的一条数据绝对只对就A中的一条数据;
3)多对多;A里的一条数据对应B里的多条数据,B里一条数据也对应A中的多条数据.
一对一的表设计用的不多.可能用到的情况有:
a)对一个表中大多数时候不查的字段,放到另一个表中对应起来.这样可以提高大多数时候查询的效率;
b)若表中记录还有些字段的值未知,可以将这些字段分出来放.这样可以让主表中不存在NULL;
c)不想轻易就查出来的数据,比如一个人的工资详情,等.可以在主另一表中放着;
d)大文本,通过一个外键关联,这样可以提高查询效率;
一对多的情况可以如下:
有一个人员信息表info,里面包括一个外键:email;这个字段里存的是邮箱表emailBox里的主键:id;因为一个人可以对应多个邮箱,但一个邮箱只能属于一个人(他自己要共用木有办法)
多对多对优化表设计的用处最大,效果最显著;一个多对多的关系是由一个连接表有两个一对多的表关系组成的;查看下图:
另外,同一个表里的各字段之间不要有复杂的依赖关系.各字段只能和主键有依赖关系.如果非主键和非主键间有依赖关系,就要将它们从主表分离出去,放在另一个表中,并通过外键进行关联