一个自己总结的数据库设计好思想,这个思想在以前做. 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 的代码在家电脑上, 固无法贴出来。
View Code
- 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; //LoadType
- 11 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
- } //删除=替换 修改=替换 默认设置=替换 ==1
- 40
- 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 block
- 60 e.printStackTrace();
- 61
- }
- 62 63 64
- }
- 65
- else 66 {
- 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 block
- 76 e.printStackTrace();
- 77
- }
- 78 79
- }
- 80 81 82
- }
来源: http://www.cnblogs.com/xiaoliao/p/5889348.html