根据实例说数据库设计(一)—— 人员管理

简介:      说在前面      可能您会问,树的系列还差第三篇没有写呢,怎么就又说数据库设计了?因为如果写第三篇的话,那么就涉及到了权限,而权限里面又涉及到了人员,这些信息都是存放在表里面的,所以就只好先说数据库设计了。

 

     说在前面

     可能您会问,树的系列还差第三篇没有写呢,怎么就又说数据库设计了?因为如果写第三篇的话,那么就涉及到了权限,而权限里面又涉及到了人员,这些信息都是存放在表里面的,所以就只好先说数据库设计了。

(说到这里,我也感觉到了,以数据库为主的话,各方面的关联确实比较密切,不容易分割,如果使用面向对象的话,也许能够更清晰的分割开来吧。)

     前提:这里讨论的还是以数据为主的项目,数据都需要保存在关系型数据库里的项目。

     

     正文:

     当您接手一个项目后,打开SQL Server 一看,靠,五、六百个表,晕倒。打开数据库的设计图一开,一大堆的表挤在一起,各种连线错综复杂的一团,这绝对可以和迷宫相媲美了。爬起来再晕倒。

     您想改变这种情况,于是您选择了面向对象,希望面向对象能够解决这种乱糟糟的情况,我不知道您成功了没有。

     而我的思路是:数据库的事情还是找自己人来解决吧,不要麻烦外人了。所以我想进行一点小小的“改革”—— 增加几个概念,从另一个角度来看表之间的关系。

【表关系的图】

 

【以人员管理为例的说明】


     表组:就是一组表,一些相关的表组合在一起,组成一个组,共同表达一项事物。比如这里要说的人员管理,和人员比较密切的若干各表和在一起,组成了人员表组。类似的还有以后会说的组织机构、权限管理等。

     表群:一个大模块需要的表、表组,组合在一起,就是一个表群。

     相关表:有关联的表。
     不相关表:没有直接关系的表。比如人员表和产品分类表。

     主表、跟随表、边界表、描述表。

     主表:主要的表,核心表,可以独立存在。比如这里的人员自然信息表。是一个表组的“代表”。
     跟随表:跟着主表走的表,不能独立存在。比如这里的联系信息表、工作经历表等。由于跟随表只记录主表的ID,而只看ID是不知道到底是谁的信息,所以说不能独立存在。     

     边界表:就是承上启下的意思,用于多对多的表的连接。也是连接两个表组的表。比如这里的“人员——角色表”、“人员——组织结构表”。

     描述表:描述一个具体情况的表,比如省份表、学历表、产品分类表等。也就是字典信息表。

     命名习惯:我的命名习惯是加前缀。表名前面要加上大模块的前缀(或者表组的前缀),后面才是表名。因为在SQL Server 的企业管理器里面可以按照表名来排序,这样相关的表就会排在一起,看起来方便一些。

     视图名的前面要加上视图的标识(前缀),我习惯加上“V_”来和表名相区分。

     存储过程的前面最好也加上一个存储过程的标识(前缀),我习惯加上“Proc_”。

     注意:存储过程最好不要使用“sp_”,“xp_”,“dt_”开头。因为系统提供的存储过程和扩展存储过程都是以这些开头的,在寻找存储过程的时候,如果是这些开头的话,那么会先到系统的存储过程里面去查找。另外,加这样的前缀也不容易和系统的存储过程相区分。

 

     这样我们在总体设计的时候,只需要关注的“表组”(其实也就是“主表”)和表组之间的关系就可以了,描述表、边界表都可以忽略,而跟随表大多数也可忽略了,在需要的时候看一下就可以了。主表是一个表组的“代表”,所以一个表组里面只能有一个主表。

     这样在打开设计图的时候,映入眼帘的就不是一大堆表的,而是几个(或者十几个)表组。如果是很大的项目的话,那么看到的是几个表群。只有当需要关注细节的时候才去看一个表组里的有哪些表,再进一步看细节的话,才去看表里面的字段。


(虽然现在面向对象很流行,但是我还是习惯先设计数据库,以数据库为中心,围绕数据库转。当然这样的话,就给自己做了一个限制,只能够做那些需要数据库的项目,不过这样的项目也有很多呀,够我做的了,呵呵。)

 

     很多项目都需要有一个人员管理的模块,这个可以说是一个基础吧,无论是OA、CMS、ERP、企业定制等都是需要的,网站里也会有一个会员系统吧。所以我就从这个比较基础的开始吧。(请看上面的图)

     人员管理,首先要有姓名、性别、出生日期等信息的表,我们把这个表叫做“人员自然信息”,这里的字段的特点就是“唯一”,一对一的,自然里的,基础的,基本的就放在这里面。这个也就是人员表组的主表。

     有了自然信息后,需要有一个联系信息,这个表也是一对一的。固定电话、手机、QQ、MSN、Email等。这是一个跟随表,跟着主表(人员自然信息)走的表。

     然后就是学习经历、工作经历等一对多的表。这些也都是跟随表。

     最后是登陆账号。而“人员——角色表”、“人员——组织结构表”,这个就是“边界表”,就是联系多对多的一个表,他负责“联系”两方面的表。

     这么多的表如何来关联呢,很简单都只用EmpID来关联。

 

     您可能会问如果一个人有两个手机号码,而表里面只有一个手机号的字段,那么要如何解决方式呢?有两种方式:一是不管有多少手机号,都放在一个字段里面,用逗号来分割就可以了。另一个就是增加一个字段,分别叫做“手机号1”、“手机号2”。您可能会说这种方法都不合理,应该把联系方式表改成一对多的形式。我觉得改成一对多就更麻烦了。

 

总结:

     一对一、一对多、多对多,主从表,这样的分析完全是由关系型数据库本身的特点来做的,一点业务逻辑都没有考虑进去。

     而我的上面的方法是把业务逻辑“掺和”进来了,从业务逻辑的角度来分析数据结构,做划分、做分组。

     我想,大家或多或少都是这么做的吧,我这里只是把这种方式给“挑明了”。欢迎大家的看法。

 

 

 

 

相关文章
|
27天前
|
存储 监控 安全
数据库多实例的部署与配置方法
【10月更文挑战第23天】数据库多实例的部署和配置需要综合考虑多个因素,包括硬件资源、软件设置、性能优化、安全保障等。通过合理的部署和配置,可以充分发挥多实例的优势,提高数据库系统的运行效率和可靠性。在实际操作中,要不断总结经验,根据实际情况进行调整和优化,以适应不断变化的业务需求。
|
27天前
|
负载均衡 网络协议 数据库
选择适合自己的数据库多实例负载均衡技术
【10月更文挑战第23天】选择适合自己的数据库多实例负载均衡技术需要全面考虑多种因素。通过深入的分析和评估,结合自身的实际情况,能够做出明智的决策,为数据库系统的高效运行提供有力保障。
108 61
|
27天前
|
存储 负载均衡 监控
数据库多实例的深入解析
【10月更文挑战第24天】数据库多实例是一种重要的数据库架构方式,它为数据库的高效运行和灵活管理提供了多种优势。在实际应用中,需要根据具体的业务需求和技术环境,合理选择和配置多实例,以充分发挥其优势,提高数据库系统的性能和可靠性。随着技术的不断发展和进步,数据库多实例技术也将不断完善和创新,为数据库管理带来更多的可能性和便利。
93 57
|
27天前
|
缓存 负载均衡 监控
数据库多实例的负载均衡技术深入
【10月更文挑战第23天】数据库多实例负载均衡技术是确保数据库系统高效运行的重要手段。通过合理选择负载均衡策略、实时监控实例状态、不断优化调整,能够实现资源的最优分配和系统性能的提升。在实际应用中,需要根据具体情况灵活运用各种负载均衡技术,并结合其他相关技术,以满足不断变化的业务需求。
|
16天前
|
关系型数据库 MySQL 数据库
【赵渝强老师】启动与关闭MySQL数据库实例
MySQL数据库安装完成后,可以通过命令脚本启动、查看状态、配置开机自启、查看自启列表及关闭数据库。本文提供了详细的操作步骤和示例代码,并附有视频讲解。
|
1月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
68 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
1月前
|
SQL Shell 数据库
在TDengine容器中创建初始化数据库的Shell命令实例
以上就是在Docker容器环境中部署并初始化TDengine数据库的全过程,希望对你有所帮助。
66 0
|
3月前
|
SQL Java 关系型数据库
应用DriverManager类创建sqlserver数据库连接实例 JSP中使用数据库
该博客文章介绍了在JSP中使用JDBC连接SQL Server数据库的方法,包括加载数据库驱动、建立数据库连接的过程,并提供了一个使用DriverManager类创建数据库连接的Java示例代码。
|
4月前
|
存储 关系型数据库 分布式数据库
PolarDB产品使用问题之如何将数据库从一个PolarDB实例导入到另一个PolarDB实例
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
3月前
|
存储 Serverless API
Serverless 架构实现弹幕场景问题之在initializer方法中初始化数据库实例如何解决
Serverless 架构实现弹幕场景问题之在initializer方法中初始化数据库实例如何解决
31 0
下一篇
无影云桌面