数据库表设计

好的数据结构会影响速度。好的数据库表设计会影响数据库操作效率。特别是数据多的时候,如果表的结构不好的话操作的时候条件(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;因为一个人可以对应多个邮箱,但一个邮箱只能属于一个人(他自己要共用木有办法)

多对多  对优化表设计的用处最大,效果最显著;一个多对多的关系是由一个连接表有两个一对多的表关系组成的;查看下图:
 user_id  user_name
 1  张三
 2  李四
 3  王五
 user_id  produc_id
 1  1
 1  3
2  2
2
3
3
1
3
2
3
3
  produc_id   produc_name
 1  LiNing
 2  Nike
 3  Adidas

另外,同一个表里的各字段之间不要有复杂的依赖关系.各字段只能和主键有依赖关系.如果非主键和非主键间有依赖关系,就要将它们从主表分离出去,放在另一个表中,并通过外键进行关联.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值