随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了。

其实也许我们每天面对的太多东西了,觉得很多都稀松平常了,即使很细微的地方,可能我们都已经形成习惯了。反过来,如果我们切换到其他领域,如IOS、android,那么开始我们可能对里面很多设计的规则不甚了解,开始可能也是一头雾水。

本篇想作为我的《循序渐进开发WinForm项目》系列的开篇,主要介绍数据库设计方面注意的一些事项,从而方便项目框架的搭建和开发过程。

1、数据库表设计

俗话说万层高楼从底起,开发应用项目,数据库的设计很重要,它可能是业务对象,业务流程的综合设计,好的数据库设计可以减少后期的重复返工,提高开发效率。

我们以一个简单的数据库表进行设计讨论,一步步分析其中的关系。

1)表和字段名称

一般表名称,根据不同的业务关系,我们可以使用不同的前缀进行区分,使用前缀,可以非常方便区分不同的业务表,如我自己一般基础表使用 “TB_” 定义前缀,权限系统表使用"T_ACL_"定义前缀,工作流表使用“TBAPP_”,业务表使用"T_"等,这样对于区分不同的业务,方便管理很有好处。

字段名称方面,我们可以约定一些规则,如约定主键使用ID;一般来说,ID作为主键,可以使用自增长的整形字段,也可以使用GUID的字符型字段,如果为了方便兼容不同的数据库且方便迁移或者开发基于网络方面的应用,我建议还是使用GUID的字符型字段,使用这种类型的字段,我们从创建数据的时候,就可以知道这个记录的主键,对于我们维护父子表等关系非常有利。

字段的命名,建议一简单为主,如客户名称,直接使用Name来命名即可,不需要使用CustomerName这样啰嗦的名称。

由于如果采用字符型的ID主键,那么我们如果需要正确排序的时候,可能需要增加一个CreateTime的日期类型,方便我们根据日期进行排序。

如果这个表还有一个外键的引用,建议统一命名标准,我一般使用“表名称_ID这样的名称,如User_ID、Contact_ID等相似的名称作为外键,不需要表的前缀。

2)数据库的模型设计

数据库的模型设计,我们建议在第三方的数据库设计工具上进行设计,如PowerDesigner这样的设计工具,使用工具设计数据库有很多好处,一个是可以高效率进行调整,二是根据需要生成不同的数据库类型Sql语句,三是可以全局了解各个表之间的关系等等。

使用PowerDesigner这样的数据库设计工具,能够在很大程度上提高我们数据库的设计效率。

2、项目框架的生成

设计好数据库后,我们通过代码生成工具进行整个项目框架的生成,这样对于我们在开发新项目上有很好的好处,里面的项目层级、DLL的 引用关系,已经处理好了,这样对我们非常方便。不过大多数情况下,我们都是增量开发较多,也就是我们可能前面已经完成了一些其他业务的开发,可能新增一个两个表,或者一批业务表的处理,这样也没关系,我们把新生成的代码复制到项目即可,由于项目生成的时候,指定了主命名空间和相关的表前缀,这样我们生成后的代码就方便阅读很多,减少累赘和出错的机会。

WInform开发框架,常见的分层模式,可以分为UI层、BLL层、DAL层、IDAL层、Entity层、公用类库层等等

这个分层,在Web项目或者WInform项目(包括WPF项目)这些分层都是可以重用的,这样我们就不用重复处理界面一下的逻辑,针对性的开发我们需要的界面层即可。

DAL层根据不同的需要,扩展支持不同的数据库类型,每个数据库类型,对应一个数据库访问实现层即可,它们实现IDAL层的接口,称之为数据库访问接口实现层。

如果我们选择开发混合型开发应用,我们可能还会有一些WCF的服务逻辑层、WCF服务层、客户端调用层、界面层(后面再介绍)等方面,如下的项目结构所示。

3、项目代码分析

通过代码工具,我们已经可以完整生成基础的项目框架了,下面我们来分析下项目的源码,从而知道整个框架的架构和代码的层次是如何的。

刚才我们看到,生成的项目里面,已经包含了实体类,我们以开篇介绍的一个表生成的代码来进行研究分析。

生成的实体类代码如下所示

    /// <summary>
/// 客户信息
/// </summary>
[DataContract]
public class CustomerInfo : BaseEntity
{
#region Field Members private string m_ID = System.Guid.NewGuid().ToString(); //编号
private string m_Name; //姓名
private int m_Age = ; //年龄
private string m_Creator; //创建人
private DateTime m_CreateTime; //创建时间 #endregion #region Property Members /// <summary>
/// 编号
/// </summary>
[DataMember]
public virtual string ID
{
get
{
return this.m_ID;
}
set
{
this.m_ID = value;
}
} /// <summary>
/// 姓名
/// </summary>
[DataMember]
public virtual string Name
{
get
{
return this.m_Name;
}
set
{
this.m_Name = value;
}
} /// <summary>
/// 年龄
/// </summary>
[DataMember]
public virtual int Age
{
get
{
return this.m_Age;
}
set
{
this.m_Age = value;
}
} /// <summary>
/// 创建人
/// </summary>
[DataMember]
public virtual string Creator
{
get
{
return this.m_Creator;
}
set
{
this.m_Creator = value;
}
} /// <summary>
/// 创建时间
/// </summary>
[DataMember]
public virtual DateTime CreateTime
{
get
{
return this.m_CreateTime;
}
set
{
this.m_CreateTime = value;
}
} #endregion }

其中我们看到下面的代码,里面使用了基类 BaseEntity,这个是所有生成的实体类的基类,基类BaseEntity只是一个实体类的声明,没有什么属性,使用这个实体类基类,只是为了整个框架更好管理和控制。BaseEntity来源于公用类库,已经封装在里面了。

    /// <summary>
/// 客户信息
/// </summary>
[DataContract]
public class CustomerInfo : BaseEntity
{

另外,我们看到,实体类有注释,这些注释来自数据库的备注信息,包括字段的注释也是来自数据库的备注说明信息。

还有类的定义里面,还看到了[DataContract] 的标签,以及类的属性[DataMember],这个是WCF技术里面传输数据的协议声明,我们目前开发的应用,一般都是基于.NET4.0的了,因此包含这个属性方便我们在开发网络版项目的时候用到,一般情况下忽略即可。

我们继续看看实体类的其他部分代码:

        #region Field Members

        private string m_ID = System.Guid.NewGuid().ToString(); //编号
private string m_Name; //姓名
private int m_Age = ; //年龄
private string m_Creator; //创建人
private DateTime m_CreateTime; //创建时间 #endregion

我们看到,对于字符型的ID主键字段,代码生成的时候,已经自动添加默认属性值(GUID:System.Guid.NewGuid().ToString() )的了,这样我们创建实体类的时候,这个ID的值就已经生成了。

好了,基于篇幅的原因,下次继续介绍项目框架代码的各部分组成,以及他们之间的关系,注意的实现和内在约定等内容。

循序渐进开发WinForm项目(1) --数据库设计和项目框架的生成的更多相关文章

  1. 循序渐进开发WinForm项目(6)--开发使用混合式Winform模块

    1.Winform数据访问模式定义 传统的Winform程序模块:用于传统的数据库通讯获取数据,这种方式获取数据,方便快捷,可以用于常规的业务系统的场景,用于单机版软件或者基于局域网内的业务系统软件. ...

  2. 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  3. 循序渐进开发WinForm项目(4)--Winform界面模块的集成使用

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  4. 循序渐进开发WinForm项目(3)--Winform界面层的项目设计

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  5. 循序渐进开发WinForm项目(2)--项目代码的分析

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  6. 第二天ci项目规划 数据库设计

    第二天ci项目规划 数据库设计 商品 + 用户 + 订单 数据库设计思想和方法 关于商品品牌 ,分类 ,属性 如何表示 用一个字段 还是再设计一张表 品牌和商品 是一种信息 还是两种信息 一张表一般只 ...

  7. Vue/Egg大型项目开发(二)数据库设计

    项目Github地址:前端(https://github.com/14glwu/stuer)后端(https://github.com/14glwu/stuer-server) 项目线上预览:http ...

  8. HNU_团队项目_数据库设计感想_个人感想

    数据库设计感想  个人的一点心得体会 最重要的放在最前面——讨论开会时的123经验 开会前对会议目的及方式要有所考虑: 不要随意无目的开会: 遵守时间,控制会议时间长度: 会议主持人要维持会议只需,有 ...

  9. Django 博客项目01 数据库设计与验证码校验+Ajax登录

    数据库设计 from django.db import models from django.contrib.auth.models import AbstractUser class UserInf ...

随机推荐

  1. 关于MYSQL中like 检索汉字问题。

    mysql中like’中国‘查询不出来结果 如果 like‘zg’就看查询出来结果. 查询了半天是由于mysql中编码的原因 解决办法: 进入mysql 输入命令:show variables lik ...

  2. Git + BeyondCompare

    Mac 环境: 1. 安装 BeyondCompare 2. 配置 ~/.gitconfig [diff] tool = bcomp [merge] tool = bcomp [difftool &q ...

  3. ORA-12571: TNS:packet writer failure

    ORA-12571:TNS:包复写器失效 2007-05-28 22:04 ORA-12571:TNS:包复写器失效 近日一直在做Oracle数据库的搭建(入门),在搭建过程中遇到“ORA-12571 ...

  4. TSPL学习笔记(4):数组相关练习

    最近研究函数式编程,都是haskell和scheme交互着看的,所以笔记中两种语言的内容都有,练习一般也都用两种语言分别实现. 本篇练习一些数组有关的问题,之所以与数组相关是因为在命令式编程中以下问题 ...

  5. Codeforces 55D Beautiful Number (数位统计)

    把数位dp写成记忆化搜索的形式,方法很赞,代码量少了很多. 下面为转载内容:  a positive integer number is beautiful if and only if it is  ...

  6. Android之NDK开发

    转自:http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html 一.NDK产生的背景 Android平台从诞生起,就已经支持C ...

  7. MFC一个类访问另一个类成员对象的成员变量值

    MFC中一个类要访问另外一个类的的对象的成员变量值,这就需要获得原来那个类对象的指针,其实有好几种方法都可以实现. 比如维护一个单例模式.设置静态变量等等.我们这里举个列子,实现多个类之间的相互访问. ...

  8. MS SQL的存储过程

    -- ============================================= -- Author: -- Create date: 2016-07-01 -- Descriptio ...

  9. kail2在虚拟机上的安装

    首先先要安装虚拟机,打开安装包,下一步               选择典型 选择要安装到的目录,点下一步 4 输入密钥,下一步(密钥网上有很多我这边就例举一个,没用的话就自己找.我这个密钥是VM11 ...

  10. NFC 与 Windows Phone 的那点事儿

    说起NFC这个词儿应该已经不陌生了,在我们的生活中有很多使用场景都是使用的这项技术,例如公交卡,门禁,还有银联的闪付卡等等.并且近些年在移动设备上使用的场景也越来越多,例如 对 NFC TAG 的读写 ...