你的位置:首页 > 数据库

[数据库]一个自己总结的数据库设计好思想(原创)


    一个自己总结的数据库设计好思想,这个思想在以前做.net开发,创建数据库时,自己就常用了,所以我做的项目,你是不会看到茫茫多的表存在数据库中的,不管你是什么项目,我这设计思想至少可以用到你一半左右的数据库表中,下面就来仔细介绍下我这思想,还有这里你要想明白我这思想,请你暂时抛弃传统的创建数据库的思路。

   1.适用表类型:

          每个用户都有的数据,数据不是很大,或则一个类型只有一条数据,操作只是用户对字段值的改动,比如---->地址表-->积分表--->或则我当前做这个app的 游戏积分记录表。

 2.优点:

          大程度减少对应表给服务器带去的压力,并且减少访问接口的方法,你只需要写一个方法接口,就能实现对一个对应表的增删改操作。

 3.缺点:

        稍微增大了客户端对数据处理的复杂度

 4.实例讲解: 

      我下面会以,客户端(IOS)+服务端(Servlet+mysql)来讲我这思路。   

       1.IOS客户端:

    

 

  首先看上面做个app地址截图:  从截图上来看这个界面对应的数据库表需要操作的方法有:加载,设置默认,修改.删除,增加地址 一共5个方法,但是这里我要告诉你用我这个设计思路创建的数据库表,只需要两个接口方法就能实现这5个方法功能,第一个->加载 第二个->修改(update),其中设置默认 修改 删除 增加 在我这个思路设计的表中都可以通用一个方法。(update).

   2.表设计思路:

      我这里先用文字描述下,等会截表图出来,就如上app截图,这里按照常规思想来,在创建的地址表中至少要出现5个字断,1=id 2=对应的用户id,3=名称,4=手机号 5=详细地址,如果以这种传统的方式创建的表,只要用户增加一个地址,那么对应的表中就会多出一条数据,一个简单的道理,数据库中表的数据条数多少是影响用户查询效率的一个重要因素。所以这里我就是当时就是以这点出发,想到了我这个对表的设计思路。   

      下面说思路了, 呵呵我这个设计思路出来的表,就针对以上这个地址表来说,用户不管如何新增地址(当然之前我也说了,这个思路不太适宜数据超庞大的表),在地址表中他的数据只会保存一条,不过这里即使他删除了所有地址,也会给他保留一条数据。只是地址组合字断的值为空

    我创建这个表的思路就是,将表中的  用户名称-->手机号-->详细地址,组合成一个有规律的字符串,保存到一个字断,这里简单点说就是将,3个字断组合成了一个字断,那么现在起时就只有三个字断了, id   用户id  (用户名称,手机号,详细地址)

     下面我会来一个表的截图奉上

    

   看上面的图,这样我在表中对 地址的 修改,增加,删除,设置默认,就指需要 替换  address这个值就行了,

  update addressSheet set address="新组合" where account="account";  (其实我当前项目中这个address是创建在user表中的,这样就会少创建一张表,而且之后对这地址的加载都是在客户端缓存中了,我这里弄出来是为了好讲解这思路)

当前这里涉及到了ios端比较复杂的字符串处理,不过只要你把方法封装好,处理也是如此的简单。在这里奉劝别去创建对象这些,你如果创建对象来处理这个会增加负担,直接用NASrray 和 NSObject来处理数据,包括servlet端我当前也很少创建类这玩意,我觉得这玩意遇到超大的团队合作项目用用还好,好的地方都是好管理,并不是提高项目的性能。性能用它只会降低,这个是我的经验。

 

 没啥东西我还贴下我servlet的代码,ios的代码在家电脑上,固无法贴出来。

 1 response.setContentType( "text/html"); 2     response.setCharacterEncoding("utf-8");  3     request.setCharacterEncoding("utf-8");  4     String AddressType; 5     String ReplaceAllStr; //设置默认也是将所有字符串替换掉,删除也是,修改也是 6     String Account;   7     8     String[] mysqlParameter;  9       JSONArray returnJsonArray;10      JSONObject returnJsonObject = null; //LoadType11       ResultSet returnData;12    13    14  15         Account=request.getParameter("account");  16         AddressType=request.getParameter("LoadType"); 17        18         19       //加载20         if(AddressType=="0")21         {22           mysqlParameter=new String[]{Account};23          24         returnData=MySqlHepler.executeQueryT("select address from userSheet where account=?",mysqlParameter);25 26           try {27              returnJsonObject =new JSONObject();28              returnJsonArray=ResultToJsonTool.resultSetToJsonArry(returnData);29              returnJsonObject.put("Rows", returnJsonArray);30              returnJsonObject.put("GetType", "0");31              returnJsonObject.put("Success", "1");32               response.getWriter().println(returnJsonObject.toString());33              34           } catch (SQLException | JSONException e1) {35             36             37             e1.printStackTrace();38           }39         }//删除=替换 修改=替换 默认设置=替换 ==140         else 41         {42          ReplaceAllStr=request.getParameter("ReplaceAllStr");43          //ReplaceAllStr="liaohang,13983918073,重庆江北区石马河金色年华|liaohang,13983918072,重庆江北区石马河街道金色年华,default|liaohang,13983918073,重庆江北区石马河街道金色年华";44          returnJsonObject =new JSONObject();45           mysqlParameter=new String[]{ReplaceAllStr,Account};46           int Result=MySqlHepler.executeUpdate("update userSheet set address=? where account=?",mysqlParameter);47           48           if(Result==1)49           {50             51            try {52              53            54             returnJsonObject.put("GetType", "3");55            returnJsonObject.put("Success", "1");56            57            response.getWriter().println(returnJsonObject.toString());58         } catch (JSONException e) {59           // TODO Auto-generated catch block60           e.printStackTrace();61          }62         63          64           }65           else66            {67           68            try {69            returnJsonObject.put("Success", "0");70            returnJsonObject.put("Msg", "操作失败,请稍后再试!");71           72            response.getWriter().println(returnJsonObject.toString());73           74         } catch (JSONException e) {75           // TODO Auto-generated catch block76           e.printStackTrace();77         }78          79        }80           81          82  }

View Code