数据库表设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;因为一个人可以对应多个邮箱,但一个邮箱只能属于一个人(他自己要共用木有办法)

多对多对优化表设计的用处最大,效果最显著;一个多对多的关系是由一个连接表有两个一对多的表关系组成的;查看下图:

另外,同一个表里的各字段之间不要有复杂的依赖关系.各字段只能和主键有依赖关系.如果非主键和非主键间有依赖关系,就要将它们从主表分离出去,放在另一个表中,并通过外键进行关联

相关文档
最新文档