我们该如何设计数据库(二)

数据库 数据库运维
本篇文章旨在讨论如何抽象(以用户作为抽象的例子),并提出一些解耦的思路。详细请见下文

最近公司要开发新系统,基本决定使用ORM(高层还在犹豫,担心效率问题)。既然使用了ORM,那么自然而然的就想到了用面向对象的思想来设计数据库。

本篇文章旨在讨论如何抽象(以用户作为抽象的例子),并提出一些解耦的思路。

我也是***次在实际项目中使用面向对象的思想来设计数据库,写下这篇博客,也是希望与大家多多交流。

正文开始

首先来需求分析

我们的系统有前台和后台,前台用户有:Man,Woman,SuperMan,SpiderMan与IronMan。后台用户为Administrator。

前台用户都要填写联系方式与地址,然后SuperMan,SpiderMan与IronMan都有Ability。

需求很简单。那么按照这个需求,我们来随手画一个继承关系图。其中V代表抽象类(应该是abstract,画图的时候脑抽想着是virtual就用V开头了,懒得改图了大家凑合着看吧),I代表Interface。如下图:

从图中可以看出,由抽象类Person派生出Administration与抽象类User。类Man与类Womam实现了接口Address与接口Contact,Inhumans则实现了Ability接口。

然后抽象类代码:

  1. View Code   
  2.  
  3.     public abstract class Person  
  4.     {  
  5.         public string Username { get; set; }  
  6.         public string Password { get; set; }  
  7.     }  
  8.  
  9.     public abstract class User : Person  
  10.     {  
  11.         public string Name { get; set; }  
  12.     } 

接口代码:

  1. View Code   
  2.  
  3.     public interface IAddress  
  4.     {  
  5.         string Address { get; set; }  
  6.     }  
  7.  
  8.     public interface IContact  
  9.     {  
  10.          string Email{get;set;}  
  11.          string WorkPhone { get; set; }  
  12.          string MobilePhone { get; set; }  
  13.          string Fax { get; set; }  
  14.     } 

***是Man类和Woman类:

  1. View Code   
  2.  
  3.     public class Man : User, IContact, IAddress  
  4.     {  
  5.         public string Address { get; set; }  
  6.         public string Email { get; set; }  
  7.         public string WorkPhone { get; set; }  
  8.         public string MobilePhone { get; set; }  
  9.         public string Fax { get; set; }  
  10.  
  11.         public bool HasCar { get; set; }       //如果这三项都为false的话  
  12.         public bool HasHouse { get; set; }     //这辈子就甭想结婚了  
  13.         public bool HasMoney { get; set; }     //T T我泪涌  
  14.     } 
  1. View Code   
  2.  
  3.     class Woman : User, IAddress, IContact  
  4.     {  
  5.         public string Address { get; set; }  
  6.         public string Email { get; set; }  
  7.         public string WorkPhone { get; set; }  
  8.         public string MobilePhone { get; set; }  
  9.         public string Fax { get; set; }  
  10.  
  11.         public bool IsBeauty { get; set; }  //这个为true,一辈子不愁吃喝  
  12.     } 

代码非常简单。其他几个类限于篇幅就不说那么细了。

那么按照这个model,使用EF Model First来建立数据库,得到的Woman表如下:

那么接下来就是重点了:为什么不把Contact和Address分表储存。这样与Man表、Woman表写在一起的话,出现改动(如新增一种联系方式),会不会非常痛苦。

如果不是使用ORM,那么这个改动的确是很痛苦;但是如果使用了(这里默认使用的ORM可以从Model生成/改动数据库),那么这个改动是没什么大不了的了,只需要修改一下接口定义,然后根据报错去改就好了。至于数据库的变动,就交给ORM去做就OK了。

这样有一个好处,可以在有限的范围内实现解耦,部分减少了关系——若将Contact和Address分表的话,取Woman要Join两次,这看起来没什么大不了的,但是如果放大了看,如果是join十次呢?这样弄出来的东西很难去维护(现在公司老系统就是这样,动不动就join十次二十次的,改动起来十分费力)

具体怎么去解耦,这个问题相当相当的深奥,就不敢在这班门弄斧了。

原文链接:http://www.cnblogs.com/CrazyJinn/archive/2012/08/20/2637459.html

责任编辑:林师授 来源: 博客园
相关推荐

2012-04-28 10:07:43

数据库数据库设计

2013-03-20 11:33:31

2013-03-20 13:25:53

数据库数据库设计

2013-03-20 13:35:12

数据库数据库设计

2013-03-20 13:16:15

2011-05-19 11:01:14

ERWin数据库设计

2023-10-16 09:00:00

数据库分布式系统

2017-07-06 15:52:22

大数据数据分层数据仓库

2022-06-30 18:17:00

数据集云数据建模计数据仓库

2021-10-03 15:00:44

数据库mysql单机

2020-12-31 05:29:25

数据库Powerdesign建模

2011-04-12 10:59:46

Oracle数据库

2017-11-23 15:06:14

前端数据库开发

2015-06-23 13:56:30

数据库设计面向对象

2017-11-30 08:56:14

数据库中间件架构师

2017-11-27 06:01:37

数据库中间件中间层

2011-08-23 17:45:54

MySQL丢失root密码

2021-04-14 09:00:00

MySQL数据库MongoDB

2011-03-01 14:04:30

2022-08-09 07:22:15

语言数据库程序
点赞
收藏

51CTO技术栈公众号