Das recently started at a small software company on the verge of completing the ultimate application: a fully-customizable system. The initial design of the system was to be so generic that they could simply edit some configuration files and go from a client management system to an order entry system. Halfway through, when they realized that they had essentially reinvented Microsoft Access, they decided to change directions and build the application towards the actual client requirements: a contact management system.

However, they still wanted their system to be fully-customizable, so they developed it so that no "business specific" information was hard coded. Instead, numbers were used for variables (e.g. V0221), classes (C0221), forms (F0221), and the "business information" was stored in the database. Some might say this is a bit of overkill for the local suburban city hall, but the designers figured that the mostly-volunteer staff might, some day, want to navigate through the maze of attribute and type configurations to redefine something like "Gender":

Form:

Database tables:

ATTRIBS
ID NAME TABLE HIST_TABLE
221 Gender ATTRIB_0221 ATTRIB_0221_HIST

ATTRIB_0221
ID VALUE ACTIVE
1 Male 1
2 Female 1

ATTRIB_0221_HIST
ID 0221_ID WHAT WHEN
1 1 Created 2004-03-01 18:22.33
2 2 Created 2004-03-01 18:22.33

But this alone wasn't enough to that made Das realize that this company wasn't a good fit. It was only after they finally delivered the system and learned they needed to add ten new "attributes" such as Middle Initial, BirthDate, etc, and Das was tasked with adding three of these attributes. They were a bit surprised he left over this, after all, to add a new attribute to the system, all one had to do was ...

  • Create a class for that attribute that allowed for values of the attribute to retrieved, added, deleted, and edited.
  • Create a form to be used to manipulate the class
  • Add the form name and class name to a global constants file
  • Create a values table for the attribute
  • Create a history table for the attribute
  • Add the name and table names to the attributes table
  • Add the name to the the entity-attrribute linking table
  • Add the form name and properties to the and the forms table