Microsoft Access Split Database Architecture to Support Multiuser Environments, Improve Performance, and Simplify Maintainability
Provided by Aparna Pophale, Quality Assurance Specialist
Microsoft Access lets you easily create databases to store and
present your data in forms and reports. When starting, a database may be
very simple and trivial, but over time, it may become more important as
you add data, features, and even share it with others. It gains a
life of its own and the overall design becomes critical.
One of the most important architectural designs is splitting the
database into a front-end and back-end database. This is how Access
is designed to let you support multiuser databases and significantly
simplify how you enhance the application over time.
Separating your application and data databases
enables you to support multiple users and upgrade the
application without wiping out their data. Assuming the
application doesn’t change that often, the separation
also makes it easier to just backup the data database
since only that is changing everyday.
A Split Database Design: Front-End/Back-End Databases
Splitting a database is a relatively simple concept. You take an
existing Access MDB/ACCDB database with its tables, queries, forms,
reports, macros, modules, etc. and divide it into two databases:
- The “Back-End” database just contains the tables
- The “Front-End” database contains the application objects
(everything except the tables) and links to the tables in the
back-end database
This design is especially useful in multi-user environments where the
back-end database is stored on a network and contains the shared data.
Each user then has a copy of the front-end database on their desktop
pointing to the shared database.
In multi-user environments, the front-end database can also contain
tables that are private to the user. These local tables can store the
user’s settings, selections, temporary or intermediate tables for
processing data or reports, etc.
Reasons to Split a Microsoft Access Database
Here are some of the major reasons to use a split database
architecture:
Multiuser Support
Each user has the application and private tables in
their copy of the front-end database. They share the
back-end database without locking it exclusively.
With temporary tables for each user in their front-end
database, conflicts and collisions among multiple simultaneous users
are avoided.
Deploy Updates without Worrying about Data
Application enhancements are simplified since they are made in
the front-end database without worrying about changes to the data in
the back-end database. Releasing new versions and bug fixes becomes
much easier since only the application part needs to be distributed
which automatically uses the current data.
Of course, if you modify table structures or add/delete/rename
tables, you’ll need to apply those changes to the back-end database.
Without a split database architecture, when you
create a new version, you’ll need to update the
database AND any data your users changed since your last copy.
Improve Performance and Minimize Database Corruption
Performance can be significantly enhanced and network traffic
reduced when the user has a copy of the front-end database installed
on their desktop rather than running it off the network each time
they use it.
Without splitting a database, multiple users running the same
database on the network increase the chance of database corruption.
The split database design minimizes this problem and avoids code
corruption from impacting data corruption.
Simplify System Administration and Maintenance
Since the data is stored
centrally and can be backed up and compacted, database
administration is simplified. A single master
front-end application database is copied to each user’s machine, but
is not necessary to back up.
Scalability
The split database architecture provides an opportunity to expand a database size beyond the 2
GB limitation of Access since the front-end database can link
to multiple back-end databases if necessary.
This also sets the stage for migration to SQL Server
(or SQL Azure). If the application
evolves to need the features of SQL Server, you can still use the
front-end database and link to data stored in SQL Server.
How to Split Your Microsoft Access Database
You can manually split your database by:
- Copying it
- Deleting all the non-table objects from one of them and make
that your back-end database
- Delete all the tables from the other “front-end” database, then
link to the tables in the back-end database.
Or, you can use the Microsoft Access Database Splitter Wizard to
split the Access database. Consider this example:
Open a Tasks template form Microsoft Access. The Tasks database
is designed with tables, queries, forms and reports. The database
contains three tables Contacts and Tasks (2007 version also have
Filters). To open a Database
Splitter, select Database Tools tab from Access ribbon and in the Move
Data pane, click on
Access Database option.

Database Splitter wizard starts.

Click on Split Database button and it opens the Save dialog window.
Provide name for back-end copy.

So "Task_Back-EndCopy.accdb" name is provided here for Tasks
database. This back-end database copy can be saved on a network to share
among multi users and front –copy can be available to each user
separately at their own desktop.
When the confirmation message box shows, click the OK button.

Now take a look at the tables in the Navigation pane, which show
small arrows at the left side of the table names. This indicates that
these three tables are now linked to the Tasks database, and resides in
the Back-end database.

So this way the front-end copy will have all forms, reports and
queries (no tables). Data changes made in the front-end copy will also
update the back-end copy, which stores only tables. Now add a new record
to the Contact List, save and close the database.

If you open back-end copy of the database and select Contacts table.
This new record appears in the table.

This way all users work on the same database using their own
front-end copy, and data changes reflect in the back-end database. Split
database architecture gives a look of Client-Server database technology
by storing database tables at back-end server and all programming part
such as forms, function, queries at front-end client side.
Access databases can link to older versions of Access database
formats. So even if the front-end database is in an Access ACCDB
format, the linked back-end database can be an MDB in Access 2000 or
2002-2003 formats or an ACCDB.
Keeping Private Tables
If you want to have private tables in the front-end database, you’ll
want to import them into your front-end database and remove them from
your back-end database. One of the amazing and powerful features of
Microsoft Access is its ability to use data from a local or linked
source in its queries, forms, reports, macros, and modules. If you need
to change the table’s location later, you can move it without impacting
the objects that depend on it.
One caveat is that if you have tables with field lookups to other
tables, those tables should be in the same database. Otherwise, if you
open that source database and that table, its lookups won’t appear which
can cause data entry and data integrity issues.
Relinking Microsoft Access Tables
Tables can be relinked interactively with the Linked Table Manager or
programmatically via VBA.
Linked Table Manager
Once the database splitting procedure is finished, you can relink the
linked tables using Linked Table Manger.
- In Access 2010 and 2013, from the External Data
ribbon, select Linked Table Manager
- In Access 2007, it's on the Database Tools ribbon
- In Access 2003 and earlier, it's under Tools,
Database Utilities

Select the table names which you want to update and click on Ok
button. If you want to link to a database located in another drive or
folder, check the Always prompt for new location box. This is common if
you develop the front-end database on your local drive with a local copy
of your back-end database (to avoid testing on the live data), then need
to deploy it.

Always make sure that links are correct before you distribute them.
It shows message for successfully linking.
Relinking Tables Programmatically using VBA
You can also write some VBA module code to update a linked table (from
our royalty-free source code library
Total Visual SourceBook):
Function ReLinkTable(strTable As String, strPath As String) As Boolean
' Comments: Re-links the named table to the named path
' Params : strTable Table name of the linked table
' strPath : full path name of the database containing the real table
' Returns : True if successful, False otherwise
Dim dbsTmp As DAO.Database
Dim tdfTmp As DAO.TableDef
Dim strPrefix As String
Dim strNewConnect As String
On Error GoTo PROC_ERR
Set dbsTmp = CurrentDb()
Set tdfTmp = dbsTmp.TableDefs(strTable)
strPrefix = Left$(tdfTmp.Connect, InStr(tdfTmp.Connect, "="))
strNewConnect = strPrefix & strPath
tdfTmp.Connect = strNewConnect
tdfTmp.RefreshLink
ReLinkTable = True
PROC_EXIT:
dbsTmp.Close
Exit Function
PROC_ERR:
ReLinkTable = False
Resume PROC_EXIT
End Function
Updating VBA Code for Linked Tables
For the most part, separating the data into a data database does not
affect your application. The queries based on the linked tables remain
the same, as do your forms, reports, and code. The main exception is
Seek statements. Seek statements are used in code to find a record. They
are very fast because they use an index you specify. For example, for a
given table (strTable), index (strIndex), and search values (varValue1
and varValue2):
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim fFound As Boolean
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset(strTable)
rst.Index = strIndex
rst.Seek "=", varValue1, varValue2
fFound = Not rst.NoMatch
However, this code fails if the table is linked. This is very
frustrating and many developers resort to the FindFirst command instead.
Unfortunately, FindFirst is very inefficient. It does not use an index
and performs a slow sequential search through the entire table. This can
be very painful for large tables. The good news is that you can use Seek
on linked tables. It’s a matter of properly identifying the database
where the table resides. Often, you will know the linked database name
and you can easily set the database variable (where strLinkedDB is the
linked database name):
Set dbs = DBEngine.OpenDatabase(strLinkedDB)
The example below is a general solution where the code tests a table
and changes the database variable if it is linked:
Dim dbs As DAO.Database
Dim tdf As DAO.TableDef
Dim strConnect As String
Dim strLinkedDB As String
Dim rst As DAO.Recordset
Dim fFound As Boolean
Set dbs = CurrentDb
Set tdf = dbs.TableDefs(strTable)
' Connect = "" if it is not a linked table
strConnect = tdf.Connect
If strConnect <> "" Then
' Database name follows the "=" sign
strLinkedDB = Right$(strConnect, Len(strConnect) - InStr(strConnect, "="))
' Change database handle to external database
dbs.Close
Set dbs = DBEngine.Workspaces(0).OpenDatabase(strLinkedDB)
End If
Set rst = dbs.OpenRecordset(strTable)
rst.Index = strIndex
rst.Seek "=", varValue1, varValue2
fFound = Not rst.NoMatch
Your front-end database is now properly linked and ready for
deployment across your network.
Managing Front-End Databases on Each Desktop
With a split database design, you'll need to distribute the front-end
database to each user. By residing on their local machine, the
performance of your application will improve. However, this adds an
extra level of complexity when your application changes.
Knowing an Update Exists
If you have a new version of your front-end database, you'll need to
replace each user's database with the new one. This means your front end
database needs to know what version it is and not run if it's not the
current one, and provide a mechanism to get an update.
This can be easily done by adding a version table in the front-end
database and the back-end database. You manually update the table in the
front-end database with its version number when you create a new build.
The back-end database contains the latest version number. When the
front-end database starts, it compares the two tables and proceeds if
the version is okay and stops if not. You'll then need a process to
replace it.
Automating the Version Detection and Update Process
FMS
offers a commercial software product,
Total Access Startup, to simplify the deployment of your Access
applications. It lets you centrally manage each Access application by
identifying the master front end database, the location where it should
be installed on each user's desktop, and its version.
Rather than running the Access database directly, a shortcut is
provided to each user so the Total Access Startup program verifies the
right version of Access is being launched with the right version of your
front-end database. If the current local database doesn't exist or is
out of sync, the latest version is installed on the user's desktop along
with any setup routines that are required. The process is seamless and
you can easily change the deployments centrally. Only one copy is needed
to manage all the Access applications across your network.
Additional Resources
Multi-user Microsoft Access applications are pretty important to your
organization. FMS offers additional resources designed for this
environment:
- Total Access Analyzer to
help you create and diagnose your databases to find errors, suggest
enhancements, and improve performance.
- Total Visual Agent to ensure
your database maintenance tasks like database backups and compacts
are scheduled and executed. Can also launch processes on a recurring
basis.
- Total Access Admin to monitor in
real-time who’s entering and exiting in your Access database.
Performance Tip
Microsoft Resource
Conclusion
Microsoft Access is a very powerful platform that lets you easily
create solutions that can significantly improve the productivity of your
team. With a properly split database architecture, you’ll find it even
easier to create, enhance, and share your application.
Good luck!
|