我们该如何设计数据库

发表于:2012-5-02 10:18

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:CrazyJinn    来源:51Testing软件测试网采编

分享:

  当然你也可以尝试下面这种写法,我个人认为这种写法更优雅

  1. var contact = 上面的SQL语句取出来的用户所有的联系方式;              
  2. txtWorkPhone.Text = (from a in contact  
  3.                      where a.ContactMethod == ContactMethod.Work_Phone  
  4.                      select a.ContactInfo).ToString();  
  5. //后面以此类推,你懂的

  注意,请不要试图使用类似下面这类语句来查询某用户的联系方式:

  1. select ContactInfo from 表 where UserRole=某种用户类型 and OwnerID=某用户ID and ContactMethod=1    //取出某用户的Email  
  2. select ContactInfo from 表 where UserRole=某种用户类型 and OwnerID=某用户ID and ContactMethod=8    //取出某用户的HomePhone

  相信我,这种做法非常愚蠢:每当你要取出这个用户的一种联系方式,就要和数据库建立一次连接,打开/关闭一次数据库;这种做法代价是十分巨大的,即使有数据库连接池,即使有数据库缓存,都应该避免这种愚蠢的做法.

  唔,用了那么多的代码,终于查出了某个用户的联系信息了。反正我个人觉得这种设计方式在查询的时候,是逻辑上的浩劫。什么?你说你很享受?好吧,看来是我脑容量不够……

  不过当我们面临需求变动的时候,那就非常愉快了。

  什么,要加一类用户?简单,UserRole加一个枚举就好了。

  什么,要加一种联系方式?ContactMethod加一个枚举就OK。

  使用了这种表设计的时候,相信你会微笑着面对需求变动的

  二逼青年

  昨天和同事也探讨了下这个问题,按他的说法就是:哪个表要联系方式,我就扔个字段进去,存json

Contact varchar(8000) 用于储存json

  举例来说,有这么一个用户:

ID:1 Name:张三 Telphone:1234 Email:123@123.com Fax:5678

  那么数据库中就这样存:

  [{"ID":1,"Name":"张三","Telphone":"1234","Email":"123@123.com","Fax":"5678"}]

  当我听到这种设计思路的时候,虎躯微微一震:靠,这都行。按这种设计,我整张表都放进一个json里面一股脑的存进去就算了。不过震惊之后仔细想一想,其实这种设计也是有可取之处

  首先,从查询来说,和普通青年一样,只需一句SQL:

select Contact from 表 where 条件

  查询之后,就可以通过json处理函数将想要的数据取出来,在此就不赘述了

  那么当面临需求变动的时候会发生什么:

  加一类用户的时候,要添加一张表。也是符合开闭原则,原有代码没有改动。

  加一种联系方式,只用存json的时候多存一点东西。

  不过这种设计如果要更新某条数据的话要稍微麻烦一点:先查询一条数据,重组json之后再Update。

  写了那么多,希望已经将想要表达的问题表达清楚了。不足之处望海涵,也欢迎留言斧正。

  PS:真的是一个规律,一个月才能写出一篇博客……

  再PS:就快能回家了,高兴,开心。

22/2<12
2023测试行业从业人员调查问卷已开启,千元大奖正在等你~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号