项目总结(2) ----构建数据库

       我做的是一个B2C的网上购物系统(全部是服装)开始客户要求的只卖男装,后来需要也能买女装,对于这个问题我

们是建议客户在录入商品名称与类别管理那个地方解决。下面就说一下我做的系统所得到的一些经验与教训吧!

     1.数据模型的建立是十分重要的,我这里说的数据模型指的是实体型【Entity Type】之间的关系结构,用数据库的专业术语

来说就是联系【Relationship】。分析的越细致对于实体之间联系理解的越深刻。例如:我在分析衣服这个实体的时候产生了偏差。

衣服的 尺寸    是衣服的属性但同时也是一个独立的实体,我当时分析时将尺寸仅仅做为一个属性设计到 衣服   里面,这样就会产

生一个问题同样一件衣服,仅仅尺寸不一样的衣服在数据库中就会存在多条记录。造成了数据冗余。

      2.再说一下基础的东西吧,在我们命名表的时候必须是有意义的,例如刚开始的时候我就命名的一个订单表:Order,有人也许

一眼就看出来了,Order是系统的保留字,其实我也知道但是当时的时候并没有意识到这个Order是保留字,所以命名完一个表后应该

检查一下时候是系统保留字。再有就是为了数据库的安全我们命名表的时候虽然是其应该具有很好的意义但是为了防止别人破解的时候

猜解数据库的表面可以加一些特殊字符来命名例如  Order$MySys 。我们会经常过滤掉用户输入的特殊字符 “$”。

       3.对于删除的处理。对于一个好的商务系统,设计Money的地方应该禁止 删除权限,不单单应该在系统中不设计删除外,最好在数

数据库表中也禁用删除权限,当然也可以在系统中设计用户的权限级别,只有特定权限的人才可以具有删除的权限,不过这并不是最安全

的方式。我们系统中对于删除的处理就是设置一个状态字段,例如对于删除的我可以设置一个Bit类型的字段,来标识删除的数据与没有

删除的数据。例如订单、还有与订单相关联的商品,删除某个商品相应的订单在查询的时候可能就会出错,所以我的处理就是标识状态字段。

        4.字段的大小。对于一个数据量不会过多的系统来说字段值可以尽量大的值。但是对于一个数据量比较客观的系统来说,划分字段大小

的时候需要十分的细致,否则如果设置的字段值过打,数据的增长是十分迅速的。

        A.手机号码应该用Bigint、Varchar或者Nvarchar类型来存储。

        B。款项金额应该用Decimal来存储。【注意SQL Server中Decimal中的大小与.NET 中Decimal大小不一致!】

       5.数据的一致性。如果我们设计数据库表的时候设置的外键,那么如果我们删除的时后可能就会有麻烦,需要级联删除,可是如果不设置

外键也就是约束那么就会造成数据库的不一致性。所以如果没有相应的约束就破坏了数据库的完整性。牺牲一致性换来方便的时候是很不值得

的,特别是一个合格的商务系统。

       6.系统中尽可能多的使用存储过程,存储过程有很多优点,执行效率好,而且还防止了拼接SQL语句带来的注入漏洞的问题。而且在维护的

时候是很便的,对于一个系统功能上分的越细其可维护性越好【当然好也是有前提的,譬如模块耦合的应该在可接受的范围内】。但是某些业务

逻辑性特别强的地方还是应该通过程序来完成。

      7.在我们使用SQL语句、存储过程的时候不要忘记视图,视图也是数据库应用中一种很好的机制。对于复杂的查询---多数的表连接,我们就可

一采用视图的结构,例如系统中查询一个订单的信息,这时候我们可能就会需要到:商品信息、配送信息、打折的商品信息等等,这种多表连接的问题

用视图解决是比较合适,当然对于程序来说视图与SQL语句没有什么不同。视图毕竟是一个或者多个SELECT语句导出的。

       8.琐碎的应用

            A.订单中关于用户收货地址的地方,最好采用多个字段完成。如收获地址、省份、城市、地区。

            B。数据库中与金额有关的地方应该统一数据类型,不要出现一个地方用的Decimal、一个地方用的Float类型。如果两者所在表有联系的时候就可能

需要到数据类型转换。

            C。一个实体【一个表】的属性【字段】只会有可以枚举的少数几个值,可此采用状态表示的办法,采用题tinyint来标识,识别的时候通过程序来实现。

            D.如果字段可以为空,最好采用添加默认值,来防止程序处理非空的情况。

            E.数据库操作的账户最好不要用sa,而是单独建立一个账户,并且设置相应的查询、删除、更新操作权限。可以在系统的WebConfig中设置多个连接字符

串,分别给高级管理员用、普通用户,两者的登录数据库的账户是不一样的。

             F。注意数据库对象【表、视图、存储过程等】的完整名称例如有个表是MyOrder,那么它的完整名称可能是dbo.MyOrder,如果用户用的是一个托管的机器,

数据库已经建立好了,需要删除以前表的结构,再建立新的表的结构插入后不注意就会出现YourName.MyOrder的情况,系统中如果使用了“SELECT  * FROM MyOrder”

那默认就是dbo.MyOrder,如果这样查询就会出现问题。

      以上这些都是我在是系统开发的时候总结的一些经验。

posted @ 2009-04-25 15:32  Justin Liu  阅读(354)  评论(0编辑  收藏  举报