数据字典 - 如梦方醒

ywfblogs 2021-08-03 原文


数据字典


数据字典

 

数据字典是一种通用的程序设计方法。可以认为,不论什么程序,都是为了处理一定的主体,这里的主体可能是人员、商品(超子)、网页、接口、数据库 表、甚至需求分析等等。当主体有很多的属性,每种属性有很多的取值,而且属性的数量和属性取值的数量是不断变化的,特别是当这些数量的变化很快时,就应该 考虑引入数据字典的设计方法。

 

数据字典有两种形式

一,      把主体的属性代码化放入独立的表中,不是和主体放在一起,主体中只保留属性的代码。这里属性的数量是不变的,而属性取值的数量可以是变化的。

二,      用一个表来放结构相同的所有属性信息,不同属性的不同取值统一编码,用“类型”来区别不同的属性,主体中保留属性代码的列表。这样主体所拥有的属性数量就是可变的了。

第二种数据字典比第一种更抽象,层级更高,也更具一般性、通用性。

 

这两种形式的归纳有些抽象,为说明这两种数据字典和它们的各种优点,下面举个简单的例子来说明:

 

现在有个需求,要在程序中处理“职员”信息。这里的主体就是“职员”,开始时“职员”有“国籍”、“证件”和“学历”等属性。

 

比如,对于一个“职员信息”页面上的“国籍”下拉列表,我们可以就用第一种的数据字典来存储不同的国家。如果不采取这样的方法,就需要手动的把所有 可能的国家名称敲到页面上。这首先有个效率的问题,每个需要用到国籍的地方都要敲一次,要敲多久?还有,如果有一天,像南斯拉夫,突然国家换名了,是不是 要所有涉及的页面都要手动地改变呢?

 

又比如,如果有一天一个代码的名称需要换一个,是不是要到数据库中把已经经存在的所有数据都更新一遍呢?如“证件”,现在叫“身份证”,有一天想改为叫“居民身份证”。原来如果没有用数据字典,就意味着,要把“身份证”这几个字存到《职员表》等信息表中:

《职员表》

姓名  证件  性别

张三  身份证 男

李四        身份证   女

….

这样,改名后就要手动改数据库。但如果使用了数据字典,《职员表》里面存的就是:

《职员表》

姓名  证件  性别

张三  001           男

李四       001           女

….

另外增加了《证件表》:

《证件表》

证件id  证件名

001      身份证

002      暂住证

《证件表》就是第一种数据字典。要改变证件名称时,只要把其中的“身份证”改成“居民身份证”就好了,只需修改一次。而且,《职员表》不用做任何修改,页面上如果用到“证件”,也不用做修改。

 

还有在程序中有时需要判断业务逻辑时,用:“select *  from 职员表 where证件= ***”,原来***是“身份证”,使用数据字典后,就是001。证件改名后,就不用手动到程序里去改,程序也就不用重新测试、发布等等。

 

但第一种数据字典也有局限性。

 

使用第一种数据字典后,程序中除“职员”类外,还就需要有一个“国籍”类、一个“证件”类和一个“学历”类,对应的数据库中也需要增加一张“国籍” 表、一张“证件”表和一张“学历”表。“职员”类则需要包含一个对“国籍”类的引用、一个对“证件”类的引用和一个对“学历”类的引用,对应的数据库中 “职员”表中也需要三个外键分别指向“国籍”表、“证件”表和“学历”表。这样的设计在类似“国籍”和“学历”这样的属性比较少时是可行的,但是随着系统 复杂性的增加,系统中会出现大量结构类似的信息表和信息类,数量一直会增加到一个不可接受的地步。这里的“职员”,已经有了国籍、证件和学历三个属性,但 如果职员还要增加“职位”属性,那么必然要多出个“职位表”,如果还有其它…那即,当取得一条主体的完全数据时,那将进行几十个表的联接(join)操作。

 

如何解决呢?

 

通过分析上述问题,可以发现的一个特征是:这些信息类的内容都是需要动态维护的,但是所需的属性是一样的,对应的数据库表中包含的字段也是一样的。关键的字段就是两个:“标识”和“名称”。“标识”用于表示不变的主键,“名称”用于表示程序界面上显示的文字。

 

第二种数据字典就是为了解决上述问题而设计的。

 

还是以上面的例子为例。在系统中去掉《国籍表》、《证件表》、《学历表》….,引入《系统代码分类表》和《系统代码表》:

《系统代码分类表》

分类标识           分类名称

Country              国籍

ID                       证件

《系统代码表》

标识                   分类                  内容

001                    Contry              中国

002                    Contry              美国

…..

501                    ID                    身份证

502                    ID                    暂住证

……

《系统代码表》的“分类”字段都指向《系统代码分类表》中的“分类标识”。这样,在程序需要获得国籍信息时,只要通过“Country”这个标识去《系统代码表》中检索就可以了。这样的设计也便于建立一个单独的程序模块来维护所有的这些公共信息。

 

对于《职员表》,使用第一种数据字典时,其表结构是:

职员ID、姓名、国籍ID、证件ID、学历ID…….

 

采用第二种数据字典后,其表结构是:

职员ID、姓名

另外增加《属性表》,该表是《职员表》和《系统代码表》的关系表,其表结构是:

属性ID、职员ID、系统代码表_标识

 

如:

《职员表》

职员ID            姓名

1                     张三

2                   李四

…..

 

《属性表》

属性ID            职员ID                系统代码表_标识

                                                001  (表示张三是中国籍)

                                                501  (表示张三的证件是身份证)

                                                002  (表示李四是美国籍)

                                                501  (表示李四的证件是身份证)

…..

 

可以看出《职员表》的设计大为简化,系统也更加灵活了,完全可以适应主体属性的大量变更了。程序的设计应用第二种数据字典时和数据库表的方法一样。

数据字典的优点

一,      在一定程度上,通过系统维护人员即可改变系统的行为(功能),不需要开发人员的介入。使得系统的变化更快,能及时响应客户和市场的需求。

二,      提高了系统的灵活性、通用性,减少了主体和属性的耦合度

三,      简化了主体类的业务逻辑

四,      能减少对系统程序的改动,使数据库、程序和页面更稳定。特别是数据量大的时候,能大幅减少开发工作量

五,      使数据库表结构和程序结构条理上更清楚,更容易理解,在可开发性、可扩展性、可维护性、系统强壮性上都有优势。

 

 

数据字典的缺点

1,         数据字典是通用的设计,在系统效率上会低一些。

2,         程序算法相对复杂一些。

3,         对于开发人员,需要具备一定抽象思维能力,所以对开发人员的要求较高。

 

所以,当属性的数量不多时,用第一种数据字典即可。对于大型的,未定型的系统,可以采用第二种数据字典来设计。至于具体的系统里怎么设计,还是要在看实际情况来找寻通用性和效率二者间的平衡。无论怎么做,关系理论和范式仍是基础。

 

数据字典的一般设计

下面给出一个用数据库实现的第二种数据字典表的设计。要注意这个设计不是唯一的,完全可以用XML、字符串等形式来设计数据字典。

数据字典表(Dictionary):

字段名

类型

说明

编号

Char(16)

间断增量(Not Null,PK)

分类名称

Varchar(64)

用来进行过滤选取字典表相关域

内容

Varchar(255)

   

父级编号

Char(16)

取Dictionary的编号(FK),用来进行等级设计。使之成为树型结构。

发表于
2018-09-20 10:58 
如梦方醒 
阅读(489
评论(0
编辑 
收藏 
举报

 

版权声明:本文为ywfblogs原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ywfblogs/p/9679549.html

数据字典 - 如梦方醒的更多相关文章

  1. Django – 中间件

    2. 今日内容 https://www.cnblogs.com/liwenzhou/p/8761803.htm […]...

  2. 添加Linux环境变量及修改中文字符集 – 我是司

    添加Linux环境变量及修改中文字符集 修改 vi /etc/profile   export JAVA_HO […]...

  3. 如何查看外网IP地址 – pamge_ly

    如何查看外网IP地址 转自:http://jingyan.baidu.com/article/e52e3615 […]...

  4. UML – 时序图 Sequence Diagram(转)

    转载自:https://blog.csdn.net/fly_zxy/article/details/80911 […]...

  5. 如何基于匹配预设句式,动态提取用户评价标签 – 马蜂窝技术

    如何基于匹配预设句式,动态提取用户评价标签 如何在保证标签内容准确性的同时,体现出更符合用户语言习惯、让用户更 […]...

  6. 买了ThinkPad X61 – Pierce

    买了ThinkPad X61 X61,我更新喜欢称之为IBM X61。 同事买了Apple 的超薄的Air,我 […]...

  7. 从零开始学架构(三)UML建模 – ITFLY8架构师之家

    从零开始学架构(三)UML建模 介绍UML的常见模型和建模的一般过程 文章大纲 1、  文章介绍 2、  UM […]...

  8. Python3漏洞扫描工具 ( Python3 插件式框架 )

    基于Python3编写的漏洞检测插件式框架,可以自定义poc或exp。 使用时可以指定要利用的单个poc或含有 […]...

随机推荐

  1. Core官方DI解析(5)-ServiceProviderEngine

    最后来看看前面一直说的Engine(工作引擎),工作引擎接口是IServiceProviderEngine在S […]...

  2. c++代码的编译

    1.gcc和g++     1.1搞清楚几个名字         GCC :GNU Compiler Coll […]...

  3. Go实现海量日志收集系统(二)

    一篇文章主要是关于整体架构以及用到的软件的一些介绍,这一篇文章是对各个软件的使用介绍,当然这里主要是关于架构中 […]...

  4. Python使用sql语句对mysql数据库多条件模糊查询

    1 def find_worldByName(c_name,continent): 2 print(c_nam […]...

  5. Python服务器开发三:Socket

    socket是操作系统中I/O的延续,它可以使进程和机器之间的通信成为可能。socket可以看成一个标准的文件 […]...

  6. web安全:QQ号快速登录漏洞及被盗原理web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全。

    QQ号快速登录漏洞及被盗原理 为什么你什么都没干,但QQ空间中却发了很多小广告?也许你的QQ账号已经被盗。本文 […]...

  7. PCIe固态存储和HDD常见的硬盘性能对比测试

    2周测试后,导致以下结果 MySQL-OLTP测试结果:(50表。每个表1000广域网数据,1000个线程) […]...

  8. 用图像分割制作专属表情包?这里有妙招!

    表情包斗图,作为人生新晋一大乐事,已经是广大网友每天必经的聊天互动环节。什么捧腹大笑、满腹槽点、彻底无语……这 […]...

展开目录

目录导航