登录注册
上海交通大学论坛 > 数据库 > 浏览当前帖子 手机版 关闭左侧栏
菜鸟对菜菜鸟说....(一)
返回本版】  【发表帖子】  【回复帖子 浏览量  3788      回帖数 0
shmily0908    等级  

楼主 发表于  2011/7/21 18:41:19    编 辑   


                    菜鸟对菜菜鸟说...... 

    不可否认,我是一只菜鸟。但是我相信,这个世界上难免还有比我还菜 
的,不妨称之为菜菜鸟。就象MUD里面Apprentice Master也要从低级到高级 
一样,我很乐意帮助广大的菜菜鸟们成长为象我一样的菜鸟。如果读者是高 
手,那么就请你把这当作我的作业,请在批改后发回给我吧。 

    第一天,菜鸟说:“学数据库吧!” 

    菜菜鸟问:学数据库难吗? 
    答:一点也不难!至少达到“基本会用”这个程度是一点都不难。如果 
你想精通的话,那就很难了,不过你现在还远得很,不用考虑。 

    问:我没有编程基础,可以学数据库吗? 
    答:可以,可以,当然可以。在我看来,数据库不仅仅是用某种编程工 
具做数据库应用程序。更重要的,它是一种思想,它教你怎么组织、管理你 
的信息资源,以使其达到最好的使用效果。实际上,如果你是在一个不大的 
办公室里工作,管理的信息量不太大,那么你完全可以不用编程,用一些现 
成的数据库工具就能达到管理信息的目的了。 

    问:那么我该从什么地方入手呢? 
    答:数据库结构设计。 

    问:听起来很复杂的,到底是什么玩意嘛? 
    答:简单来说,就是怎么设计你的数据库结构、表结构等等,使得你的 
数据存储合理,节省磁盘空间和操作时间。这是一切数据库操作的基础,如 
果这点做得不好,那么以后你想做进一步的开发、扩展,那可就障碍重重了。 

    问:数据库和表之间是什么关系? 
    答:我记得以前广大老百姓都在用FoxBase的时候,数据库和表这两个词 
是可以互换的,一张表就可以说是一个数据库。不过现在不一样了,表是存 
储数据的基本结构,很多张表组成一个数据库。 

    问:数据怎么存放在表里的? 
    答:我们一切的讨论都是建立在关系数据库模式的前提下的。在关系数 
据库中,表就是一个二维的表格。它的每一行是一条“记录”,表示一组相 
关的数据库。它的每一列是表的一个“字段”,用于指明每条记录里面的每 
个数据的意义。 

    问:举个例子可好? 
    答:例如我们建立一个简单的表tbInfo,它有两个字段:name和addr。 
往里面添加一条记录:name为“菜菜鸟”,addr为“某鸟窝”。再往里面添 
加更多的记录.....这样,你就得到一个n行2列的二维表格。这个表格里的每 
一行就是一条记录,它告诉你某人的住址在什么地方。这个表格里的第一列 
(name字段)就是一大堆名字的罗列,addr字段就是一大堆地址的罗列。 

    问:那好吧,我现在就做一张表,我首先要考虑的是什么呢? 
    答:用户要求,需求决定一切。在做数据库之前,你一定要非常明白你 
要管理的信息有哪些,它们之间有什么相互的关系。我就有好几次,因为需 
求分析做得不好,导致我的数据库不得不重新设计,相关的数据库应用程序 
也几乎重做。 

    问:我已经搞明白用户的需求了,说点实际的好不好?告诉我做一张表 
要注意些什么?或者说,应该遵循什么规则? 
    答:范式。 

    问:什么是范式? 
    答:就是表的组织原则。在不同的情况下,分析你的数据结构,决定表 
应该遵循的范式。范式有好多种,现在来说几个常用的。第一范式:如果你 
在一张表里没有两个完全相同的(重复的)信息,那么你的表就满足第一范 
式了。 

    插嘴:我还不会笨得同样的东西要记录两遍。 
    继续阐述:第二范式首先要求你的表必须满足第一范式,在此基础之上, 
如果你的表里面有一个字段是可以唯一标识它所处的记录,那么你的表就满 
足第二范式。你可以把刚才建的那个表tbInfo改造成你们公司的职员信息表, 
只要再加一个“工号”字段就可以了。因为名字是可能重复的,但是公司里 
面的工号是不可能重复的。我们把这个字段命名为id,现在你的tbInfo里面 
就有id,name,addr三个字段了。假如你的暗恋对象和你在一个公司,她的工 
号是xxx,你只要在表中找到id为xxx的那条记录,就知道该在哪里等着她, 
一见她走出家门就走上去对她说:“hi,这么巧!” 

    问:id是最后加的,为什么你把它写在前面? 
    答:对于表本身来说,字段的位置放在前面或是后面,都没关系。只要 
你填写数据内容的时候,把数据填到它的意义对应的字段里面就可以了。一 
般来说,人们习惯把一些特殊意义的字段些在前面,例如刚才那个id。 

    问:这么说,我可以在tbInfo里面再加一个“部门”字段,里面填写 
“财会部”、“管理部”、“采购部”之类的信息,我可以知道的信息就更 
多了? 
    答:是的。可是假如你在输入数据的时候,两个同样部门的人,你把其 
中一个填为“财会部”,另一个填为“会计部”。在计算机里面,它可是认 
为这是两个不同的部门,那岂不是很糟糕?比如说你想查询一下属于“财会 
部”的人的信息,可是你得到的结果中,就不会包含那些属于“会计部”的 
人的信息。 

    问:似乎是有点道理,那么我该怎么做呢? 
    答:你刚才所说的“部门”字段,其实是一个描述性的东西。我们不妨 
将其命名为dept。你可以用一个唯一性的东西来表示某个dept,例如我们再 
加一个deptid字段,它用数字来唯一标识不同的部门。如果你把财会部的 
deptid设为1,那么当你想查询这个部门的人的信息的时候,就查找deptid 
等1的人的信息,一切都ok了。 

    问:原来就这么简单啊! 
    答:不是早跟你说了嘛,学数据库,如果只要求达到基本会用的程度, 
是非常容易的。不过你现在这张tbInfo表问题还是大大的。 

    问:还有什么问题? 
    答:你的部门信息用了两个字段来表示,在同一张表里面,deptid相同 
的记录,dept字段可以说也是相同的,一般来说,描述性的信息总是比较占 
空间,多浪费存储空间啊! 

    问:那该怎么解决这个问题?而且dept字段里的信息对我来说也是有用 
的,我可不想删除它。 
    答:那就让你的表满足第三范式吧。高手们说它是数据库开发者的救星! 

    问:第三范式是什么东东? 
    答:第三范式首先要求你的表满足第二范式,在此基础之上,如果你表 
中某个(或某几个)字段相同的两个记录,不会有其它的字段再相同,那么 
就满足第三范式了。对于现在的tbInfo来说,它就不满足第三范式。 

    问:怎么修改表结构让它满足第三范式呢? 
    答:把dept独立出来放在另一张表中。把你的tbInfo改成这样两个表: 
新的tbInfo表,包含id,deptid,addr三个字段;一个tbDept表,包含deptid, 
dept两个字段。这样,任意一个dept描述性信息在你的数据库中都只存储了 
一次。你在查询某部门的所有人信息的时候,可以命令计算机给你输出 
“deptid为n的tbInfo表里的id,addr以及tbDept表中的depet”。 

    问:看来范式这玩意还的确有用,还有其它的什么范式吗?一股脑地都 
告诉我吧。 
    答:范式的确很有用,它帮你规范化你的表结构、减少冗余、节省存储 
空间、提高数据库效率。其它常见的范式还有N-B范式(我不记得是不是叫这 
个名字了),以及第四范式。选择使用什么范式来规范化表结构,取决于你 
的需求。一般来说,常用的数据库只要表满足第三范式就可以基本解决问题 
了。详细内容你自己看看书吧。 

    问:给我推荐一本可好? 
    答:我当初看的是那套著名的清华影印本系列中的“Database essential 
.....”或者类似的名字吧,我实在是不记得了。现在市面上的那种书不多, 
你看到就自然知道了,不会混淆的。关于范式,那本书里有详细的数学定义。 
当然,范式只是其中的一小部分,那本书是一个宝库,等着你去挖掘。 

    问:对了,为什么你前面举的例子中,表名和字段名都用英文写,如果 
用中文写,不是更加直接明了吗? 
    答:当然可以用中文写了。可是如果你用的操作系统、数据库系统,以 
及将来可能用到的前台软件开发工具不是中文版的,可能会导致一些问题。 
毕竟计算机领域的通用语言是英语,所以我不推荐用中文来命名表和字段, 
如果你真的很想用中文的话,就用汉语拼音吧。 

    问:哦,我知道了。接下来我们要学些什么呢? 
    答:今天就到这里,明天我们来谈谈SQL语言吧,SQL语言是数据库领域 
中的通用语言,刚才举例的建表、写入数据、查询数据等等,都可以用SQL语 
言来实现。 
1
表情
所有内容均为会员自愿发表,并不代表本站立场.
论坛帮助 会员认证删帖申请 联系我们