If MS Access were king
Published: 2020-08-21 02:07:11

If you had to convince someone their in house tool based on MS Access had a lot of room for improvement could you do it?

My journey to full stack development started in excel, then excel vba, access, SQL server with ASP.net and now SQL Server with NodeJS and Angular JS.  Each step felt like a monumental improvement over the previous step and all essentially had the same goal.  I wanted to organize and display data more efficiently and more effectively.  

Now that I have seen the light and live in the land of more capable tools, I am having a hard time explaining why MS Access isn't a good solution.  This post is an attempt to make a better case for my preferred stack.

First of all, what is the intended customers for these tools?

###Intended customers

|   Db   |  Purpose  |
|:---|:---|
|Access | Home or small businesses|
|SQL Server|Medium to large businesses|

Ok, but would a small business ever exceed the capabilities of MS Access (as a single user writing his own programs, I know I have experienced plenty of frustrations if not the actual limitations).  If so, what limitations can we point to?

###Size?

|   Db   |  Db Size  | 
|:---|:---|
|Access | 2 GB|
|SQL Server|524,272,000 GB|

Yes that is 524,272 TB for SQL server. Just a little bit more than 2 GB.  Even if 2 GB seems reasonable, note about MS Access here.  If you delete a record, MS Access does not free up this memory.  

|   Db   |  Memory strategy  | 
|:---|:---|
|Access | Requires compact and repair periodically to reclaim space.|
|SQL Server|Frees memory when records are deleted|

This makes the 2 GB of space a bit tighter.  But how much space is 2 GB?  If you are just storing text, probably plenty.  If images are uploaded though, this limit may become a problem.



### What about data backup and loss prevention?

|Db  | Restore| Reliability| 
|:---|:---|:--|
|Access| Can restore from backup. | Can be prone to data corruption if used in multiple user or networked environment|
|SQL Server| Can restore entire db from backup, or rollback individual transactions or changes made to db| Designed as a true client/server system to prevent stability and corruption issues.|

__Why is access prone to corruption?__
*MS Access's underlying technology is called JET for Joint Engine Technology*.  JET is also used in Visual basic and SQL Server Express.  The key with *JET is that it is based on the concept of file sharing*.  If multiple users are trying to access the same data, they will both get sent the entire set of data.  Two challenges arise from using file sharing:

1. How to make sure the two users don't edit the same data
``Answer to this is by employing record locking.  Optimistic locking and pessimistic locking are the two approaches used.  Staying out of these details for now, ultimately this can cause conflicts, failure to update data and even data corruption.``

2. Since the entire file or table is shared, performance can be slow on the network.  ``Limiting number of transactions, users, or amount of data shared is required to keep performance up.``

###Performance summary

|Db  | Design| Intended use | Network Traffic|
|:---|:---|:--|:--|
|Access|Server sends entire set of data for every request; client does processing| Limited number of users, limited number of individual transaction edits|Lots of overhead since for EVERY request the entire data set is sent|
|SQL Server|Server does processing and sends only relevant information over network to client|24/7 applications with high number of transactions and high number of users|MUCH lower than Access.  Only sends the specific information the client requests|

### Database Design Limitations
Ok, so what about just setting up a database?  Isn't it much easier to use MS Access's drag and drop capabilities?  Is there any design limitations to using MS Access over SQL Server?  If you are ok with workarounds, the limitations of Access are not as pronounced as I expected.  Two key things:
* If you want to do a full outer join, this is technically impossible in MS Access but you can get around it by using a LEFT JOIN, RIGHT JOIN, and bringing them together with a union.
* Sometimes MS Access performance issues require you to split up a database into a front end and a backend database.  I have read of people using even more than two linked databases for performance improvements.

If you are motivated to figure out these workarounds, I would argue you are probably motivated enough to learn SQL and SQL server (or some other Relational Database Management System (RDMS)) .  Perhaps that is a better investment in your time.

### Cost
This one turns out to be more complicated than anticipated.  The assumption here is if you are comparing the price of Access vs SQL server you are probably a small company.  Let's answer this for a company with 25 employees assuming that the application being developed is an internal tool only.  


|Db  | Cost | Total Yearly cost| 
|:---|:---|:--|
|Access| $20/user/month for Office 365| $6,000 (25 users * 20/mo*12 mo)|
|SQL Server Standard Edition|~2k/core using 1 core for standard edition + client access license (CAL)/user * 25 users| $2k + CAL cost(?) = < $8k (?) |
|SQL Server Enterprise Edition| $/core with no client access license required| ~$8,000 (1 core) - ~$13,750 ( 2 core pack)|

As we know by now, SQL Server is designed for many users doing lots of transactions a day.  As a result the number of cores is an important factor (and Microsoft has it priced that way $/core vs. $/user).  SQL server pricing is quite complex.  I wasn't able to figure out the exact price for the client access licenses needed for the standard edition.  The enterprise edition pricing does not require the CAL and is therefore independent of the number of users.


For MS Access, the # of cores of the "server" (or machine running the database) isn't relevant because *all the processing is done on the client machine*.  

Let there be no confusion, SQL Server pricing is complicated and probably requires a call with Microsoft to make sure you have the correct license.  I think I have distilled it here, but if it were me making a company decision on this, I would call and ask about pricing, then keep googling to make sure I understood all the nuances.  

### Summary
So if MS Access were king today, being used for anything and everything, what would the world be like?  We would probably have a much less world wide web.  Since MS Access doesn't support many transactions, things like twitter, facebook, and even instant messaging would not be possible.  Even the early chat message program of 1996, Mirabilis's ICQ, had a client server relationship.  Trying to write just a simple global chat program like ICQ appears to be an impossibility if your only tool is MS Access.

### An Aside
Yes I admit, I am heavily biased against MS Access since I ran into its limits writing programs for myself.  I am hesitant to say though, there may be places for the program still today, I just don't want to have any part in developing or maintaining them.