序言

这篇文章会介绍Access的一些基本知识以及我在工作中通过分割Access数据库为前后端,从而帮助其他团队提高工作效率的方法。由于Access本身对数据库分割就有专门的功能支持,所以整个过程是非常简单的,在这里我只是介绍一下流程需要注意的点

正文

背景介绍

这篇文章其实源于我帮隔壁客户服务团队的一个小忙,他们团队有一个十人左右使用的小Access数据库来同步更新并记录客户电话来的一些信息,由于客户服务的时效性非常重要(1.客户提供的信息最好马上能被其他同事访问 2.访问信息本身不应该花太多时间),但他们之前的操作是将一整个大概600M左右的数据库摆在共享文件夹中,每个同事要访问或修改数据信息时就直接打开数据库访问,如果有其他人正在访问那就只能等他们关闭后才能继续访问,而我们共享文件夹的服务器(我估计,因为全球同事都能访问特定共享文件夹)并不在香港本地,如果不是在澳大利亚至少也是在新加坡的地区办公室附近。因为本身在这么远的服务器上传输600M的文件就已经非常慢了,同时还不能保证文件的可用性,这导致他们之前做这部分工作几乎是非常困难的。

一次会议中我介绍我的另一个VBA自动工具之后(希望之后也有机会可以说一说这个),他们的老板就问我可不可以解决他们的这个问题,我稍微查了一下资料就找到了这个MS Access支持的分割数据库(split database)的方法,现在看来应该是完美解决了他们的所有问题。

Access基本知识

开始分割数据库前先复习一下MS Access的一些基本知识

数据库是用来收集和管理信息的工具。本来信息也都可以储存在一般的列表或者电子表格中,但随着数据规模不断变大,用列表或表格管理的数据可能会出现各种各样的混乱且不利于提取需要的信息。如果数据达到了这种规模,普通的方式就已经不适用于这些数据的管理,这也是像Access这样的数据管理系统(DBMS)出现的原因。

一个数据库文件中可能有多种对象(obJects),除了存储数据的表(Table)还有实现其他功能的表单(Forms)报表(Reports)宏(Macros)模块(Modules)。这些对象在一个数据库文件中可能都不只有一个。创建格式在Access 2007之后的文件后缀为.accdb,在此之前的格式后缀都为.mdb,Access版本在2007之后的也可以用来创建.mdb格式的文件。

通过Access你可以实现这些功能:

  • 向数据库中添加新的数据
  • 在数据库中编辑已有的数据
  • 删除数据库中的数据
  • 以不同的方式管理和查看数据
  • 通过报表,邮件,内联网,互联网等方式将数据与他人共享

数据库物件

表(Tables)

数据库的表看起来和电子表格一样,被用行列的形式存储,也因为这个好处,想要将电子表格数据导入数据库中是非常方便的。数据库表和电子表格的区别主要在与他们管理和储存数据的方式上。数据库表格中为了避免冗余,会将不同层面的信息分开为不同的表,比如一个电影票的数据库中可能有观影者信息,但每个观影者可能有多张电影票,这样如果每个电影票表中都存储同一个观影者信息就会导致冗余。这个过程被称为标准化(normalization)

表中的每一行都是一条记录(record),每一条记录都以不同字段(fields)的形式储存独立的信息,字段对应表中的列。比如有一条记录是关于某个观影者,那么字段可能包括他的姓,名,性别等。每一条记录代表了一个观影者在不同字段上的信息。

关于的更多细节可以参考这里

表单(Forms)

表单是一个允许用户输入编辑数据的用户界面。表单里面除了数据的展示,还会有一些带有控制命令的按钮。用户可以不使用表单而直接在表中删增改数据,但使用表单会让这个过程更加清晰方便。设计者可以通过自定义命令按钮来决定用户可以访问修改哪些数据,这也赋予了数据一定程度的安全性,来控制数据库使用者的权限。

关于表单的更多细节可以参考这里

报表(Reports)

报表是用户用来整理总结展示数据的对象。一个报表的目的通常是某个具体的问题,比如“我们今年在每部电影上的收入是多少”等等,而报表可以让数据变得更加简单易读,用户可以通过报表得到这个设计好的问题在当前数据下的答案。

关于报表的更多细节可以参考这里

查询(Queries)

查询是所有数据库系统最核心的功能之一,它通过不同的函数连接(JOIN)不同数据库,筛选(FILTER)条件来获取数据库中符合特定条件的数据。查询通常有两种基本类型:选择查询(select query)动作查询(action query)。前者可以用来获取数据,后者则是用来对数据进行特定操作,例如增加新表,更新数据,删除数据等。

关于查询的更多细节可以参考这里

宏(Macros)

Access中的宏是一种用以给数据库增加特定功能的简单的编程语言。比如用户可以用宏编程一些可以完成提取特定数据或报表的按钮,用户点击按钮便会执行这些宏。这个主要用来将一些重复而复杂的人手工作自动化。

模块(Modules)

与宏一样,模块是用来向数据库添加功能的对象。它们的区别在于宏中使用的方法是从宏操作列表中选择,而编写模块则是使用VBA编程语言进行编程。模块是作为一个单元存储在一起的声明(declarations)陈述(statements),和过程(procedures)的集合。

关于在Access中编程的细节都可以参考这里

操作流程

熟悉了Access的基本知识,现在我们可以意识到,其实一个Access数据库文件中真正存储数据信息的就只有表(Table)类型,所以我们分割数据库的理论基础就是,我们可以只把需要存储的信息(即表)放在共享网络上(作为后端back-end),而需求信息的用户只需要使用链接在这些共享的表格上的其他类(作为前端front-end)既可以实时有针对性地访问需求的信息而不需要将整个数据库传输来传输去了。由于用户实际占用的只有他们各自的前端副本,且通过网络传输的只有被需求的一小股信息流(而不是整个数据库),从而实现数据库的可用性实时性。参考微软的官方支持,我接下来就介绍我实用的详细的分割数据库的流程。

注意事项

开始之前有些需要注意的点:

  • 分割数据库前一定要先备份数据,很简单,直接复制一个副本放在一边,或者直接用副本分割。因为数据是非常宝贵的东西,在很多环境下可能一旦失去就是永远失去, 所以一点风险都不应该承担。
  • 分割数据前要提前通知用户,否则分割时用户输入的数据可能不会被记录在分割后的数据库后端中。
  • 确保用户电脑中的Access版本能够支持你分割后的数据库格式,比如我在分割数据库的同时就帮他们把数据库格式从mdb升级成了accdb,因为公司的Access版本都是统一控制的,而文件格式本身就是向下兼容,没有必要不用功能更多性能更好的新版本格式。

分割数据库

数据库分割的功能是Access自带的,只需要按照下方步骤即可完成:

  1. 首先在你的本地电脑中复制一份已有的Access数据库文件,确保左边All Access Objects栏位中没有任何被隐藏的表,如果表被隐藏是不会被自动分割的。(不要问我为什么特别提这点,第一次分割数据库发现一部分数据无法同步,DEBUG好久最后发现原来是因为那部分数据的表被隐藏,导致分割数据库没有把这些表上传至共享文件夹)

    All Access Objects(所有Access对象)选项上右键,选择Navigation Options(导航选项),这时会打开一个对话框,将Show Hidden Objects(显示隐藏对象)打勾并且确定。

    打开导航选项

    勾选显示隐藏对象并确认

    这时回到All Access Objects栏中,如果文件中有被隐藏的对象,会看到他们现在呈半透明色,右键点击他们按Unhide in this Group(该组中取消隐藏)即可解除隐藏。确保你要分割的文件中没有隐藏的表。

    image-20220301124841322

  2. 分割数据库本身就非常简单了,只需要在Database Tools(数据库工具)选项卡上的Move Data(移动数据)组中,点击Access Database(Access数据库),就会出现图中这个Database Splitter(数据库分割向导)。现在点击Split Database(分割数据库)按钮。

    image-20220301125110106

  3. 单击Split Database(分割数据库)按钮后就会出现浏览文件路径的对话框,这里就是设定后端的所在地的地方,我们选择到我们已经准备好的共享文件夹中,确保需要使用这个数据库的用户都可以访问这个共享文件夹。数据库名称和文件类型都可以改,但没有必要(除非有特别的理由,否则只有坏处没有好处)。

    image-20220301125246928

  4. 设置完成后点击Split(分割)Access就会开始自动分割数据库了,原数据库中的都会被复制到刚刚设定的后端文件中,而这时我们进行这些操作的文件就是前端文件了,表以外的其他对象就都在前端文件中了,前后端是通过网络绑定连接在一起的。数据库分割完成后会弹出分割成功的提示消息。

  5. 这里加一点是微软的官方教程没有提到的,那就是前后端分割完成后还需要点击Database Tools(数据库工具)选项卡上的Tools(工具)组中的Compact and Repair Database(压缩和修复数据库),否则前端数据库的大小可能跟分割前一样大。按照微软的说法,这是因为Access的运作方式中即使删除对象,它也不会立即将该对象曾经占用的硬盘空间释放。如果你对数据库中删改的需求很多量也很大的话,你也可以设置自动压缩和修复数据库,方法参考这里

    image-20220301125322541

  6. 最后,为了限制使用者对前后端数据的更改权限,我们把刚刚的前端文件(.accdb格式)保存为已编译的二进制文件(.accde),既将前端中可以设计更改数据库逻辑的源代码编译保存,这样二进制文件的用户可以照常使用前端需求数据,但无法对他的功能和设计做改变。具体来说只需要在前端文件中点击Save as(另存为)然后按下图中选择并保存在希望的位置即可。

    有一点特别需要注意的是,accde格式文件中不能有空的VBA函数,这些函数在accdb格式中编译不会报错,但在转换为accde格式后会导致所有VBA程序停止运行,如果不知道的话比较难以发现。

    image-20220301125353890

  7. 这时候我们已经把后端的数据库放在了共享文件夹中,并且已经有了一个可以连接后端数据库的前端文件,剩下的我们只需要把这些前端文件分发给我们的数据库用户就可以了,通过电子邮件,U盘,或者共享文件夹都可以,用户只要保存一份前端文件的副本在自己的本地硬盘中,确保他们可以通过网络访问共享文件夹,那么他们就可以像以前一样使用表以外的Access的数据提取展示等功能了。

    更改后端数据库

    如果想要更改后端数据库,或者是想把后端数据库的保存位置更改,仅仅只复制粘贴是不行的,因为前端中的连接还是在原来的后端数据库的位置。

    以移动后端数据库的位置为例,假设后端数据库中的表结构和名字都不需要变化,那么要做的就很简单:

    首先把后端数据库复制并粘贴到你想要的新位置,然后如图所示点击External Data(外部数据)选项卡上Import&Link(导入和连接)组中的Linked Table Manager(链接表管理器)。在链接表管理器中你可以分别连接当前前端数据库绑定的每一个表的位置,在我们的情况中我们只需要Select All(选择全部)然后点击上方Relink(重新连接),然后选择到你新复制到的后端数据库位置。

    image-20220301125452427

    点击确定之后会有一个弹窗,如果你新的后端数据库没有做任何更改,那么这里不要点Yes。点No它就会开始自动帮你把所有的连接从旧的位置一张表一张表地连接到新位置的每一张同名表上,但如果你点了Yes,它会要求你每一张表给他提供新的名字,除非你真的有表名字的变化否则千万别按错了,不然会浪费很多时间。

    image-20220301125530871

    最后

    通过这一次帮助其他团队解决效率问题,我复习并且更加了解了MS Access的一些基本功能和结构,同时知道了中小型团队在共享数据时可以使用Access来解决数据库同步性(synchronization)可用性(availability)问题的解决方案。

    [第6篇]