Database Design

by Rick Curtis

The Tables

The core table of the database is Incident. This tracks the bulk of information submitting about a particular incident. Each field holds a single piece of information about the accident. This is standard database design practice referred to as Normalization. However, in some cases there may be multiple pieces of information to record that is all considered to fall under one category. For example, under injuries there might be multiple parts of the body that were injured. There are several ways to deal with this.

Solution Pros Cons
Add one field for each item Keeps all the data in one table. Makes the table extremely large. Adding a new piece of information to be stored means adding an entirely new field. If there are multiple copies of the database in use synchronization becomes extremely difficult. Many database fields will be empty. Poor database design practice. Less efficient database storage.
Allow multiple pieces of data to be entered in each field. Keeps all the data in one table. Extremely poor database design practice. Makes querying the database for incidents that meet certain criteria extremely difficult and time consuming.
Create Child Tables Best practice for database design. Allows for easily adding new types of information. Does not create a "bulky" core table. More efficient for querying the database for incidents that meet certain criteria. Spreads data out over multiple tables which means that greater database expertise is needed to develop and work with the data.

The recommendation is to create an idbIncidents Table to handle the information that is discrete (that is can only have one value such as the date of the incident) and create a series of Child tables that store information where there may be multiple pieces of data. This makes the database much more extendable. If new information needs to be collected, either a new field would be added to the idbIncidents Table or a new Child table could be created.


Database Structure 1.0

Since we are starting from almost scratch we can start with 1.0 as our nomenclature. Below is a first iteration of the types of tables to be used in a relational database for this project. This is based on the Wilderness Risk Management Committee Incident Reporting database. The diagram shows the tables and the various Parent/Child relationship. For those interested in the details of the Database Tables see Database Design Structure.

Database Design


Database Naming Conventions & Tables

Table Names: Since the database could be incorporated into other existing databases (for example if desktop versions our developed) it is important to have a table naming scheme that is unique so that table names don't conflict with other existing table names (ex. using a generic table name like Category is bound to create conflicts). We have set up a table prefix of idb as the unique table prefix for all tables. For example, the central Incident table would be named idbIncidents.

Field Names: In order to allow for maximum readability and portability to other databases we have established a standard naming practice often used in database development. The field names can be multiple words where any spaces between words are separated with an underscore. A new word always begins with a capital letter. For example, the field name to record the date the incident occurred would be IncidentDate.

Primary Tables

 

Incident Table

The Incident Table is the core parent table of the database. Everything else relates to that as the primary Parent Table.

idbIncidents

Field Name Data Type Purpose
IncidentID Autonumber Primary Key
SecureID Integer Foreign key relates to separate Organization table
ProgramTypeID Integer Type of Program - Lookup Table - idbProgramType
Age Integer Age of person involved in incident
Gender Text Gender of person involved in incident
StatusID Integer Status of person involved in incident - Lookup table - idbStatusType
StartDate DateTime Start date of program
IncidentTitle Text Descriptive Title of Incident
IncidentDate DateTime Date of Incident
IncidentTime DateTime Time of Incident
TotalDays Integer Total days of program (0 if less than 1 day)
ActiveHours Integer Total active program hours
DayOccurred Integer Day in the program incident occurred (ex. day 3 of 5 day program)
IncidentType Integer Type of Incident - Loolup Table idbincidentType
LostDay Yes/No Did the incident cause the person to lose and hours/days of program
DaysLost Integer Number of days lost
LeaveField Yes/No Did the person leave the program
LeaveDate DateTime Date the person left the program
EvacuationMethod Integer What method of evacuation was used - Lookup table - idbEvacuationMethod
MedicalVisit Yes/No Did the person receive medical care
VisitType Integer What type of medical care
ReturnField Yes/No Did the person return to the field (if the person left in LeaveField)
ReturnDate DateTime Date the person returned
PropertyDamage Yes/No Was there property damage
DamageType Integer Type of property damage - Lookup Table idbDamageType
InjuryType Integer Type of Injury - Lookup Table - idbInjuryType
AnatomicalLocation Integer Anatomical location of Injury - Lookup Table - idbInjuryLocation
IllnessType Integer Type of Illness - Lookup Table - idbIllnessType
ActivityType Integer Primary sctivity person involved with at time of incident - Lookup Table - idbActivityType
Narrative Text Description of Incident
Analysis Text Analysis of Incident by Reviewer
SubmitDate DateTime Date Incident Submitted
Preparer Text Prepared by
Preparer Position Text Position of Preparer
Submitdate DateTime Date incident submitted
Reviewer Text Reviewer
ReviewerPosition Text Position of Reviewer
ReviewerComment Text Comments by Reviewer
ReviewDate DateTime Date Reviewed
DateUpdated DateTime Date Updated

This table is used to store data about the actual location of the incident. Some programs may not want to store this data while others may want to store it but do not want this information to be readily accessible to others. By breaking it into a separate table that links back to the idbIncident table in a One-to-One relationship with the value in the IncidentID field it creates a level of security for this data. One can grant access to the overall idbIncident Table but not allow access to the idbLocations table.

idbLocations Table

Field Name Data Type Purpose
IncidentID Autonumber Primary key - Same ID as IncidentID in Incident table
Country Text Country
State Text State or Province
Area Text Area
Location Text Specific Location

Child Tables - The Descriptions in this section are still under development

These tables all link to the Parent idbIncident Table. These are all tables that enable multiple values in each table. For example, an incident might have multiple contributing factors. These are stored in the idbContributingFactor table and link back to the idbIncident Table using the IncidentID field value.

idbContributingFactor Table

Contributing factors to incident.

Field Name Data Type Purpose
ContributingFactorID Autonumber Primary key
ContributingFactor Text Contributing factor(s) to incident
Active Yes/No Signifies if row is currently active

idbEnvironmentType Table

Type of environment incident took place in.

Field Name Data Type Purpose
EnvironmentTypeID Autonumber Primary key
EnvironmentType Text Type of environment incident took place in
Active Yes/No Signifies if row is currently active

 

idbIllnessType Table

Type of illness.

Field Name Data Type Purpose
IllnessTypeID Autonumber Primary key
Illnesstype Text Type of illness
Active Yes/No Signifies if row is currently active

idbIncidentCondition Table


Lookup Tables

These a tables exist to populate drop down lists and menu lists on the Web submission form. This makes sure that data entry is consistent across submissions by restricting the selections.

idbActivityType Table

Type of primary activity when incident occurred. Feeds the ActivityTypeID field in the idbIncidents Table.

Field Name Data Type Purpose
ActivityTypeID Autonumber Primary Key
ActivityType Text Activity when accident took place
Active Yes/No Signifies if row is currently active - only those items where active = yes will show up on Web drop down lists.

 

idbDamageType Table

Type of damage to property. Feeds the DamageTypeID field in the idbIncidents Table.

Field Name Data Type Purpose
DamageTypeID Autonumber Primary key
DamageType Text Type of property damage
Active Yes/No Signifies if row is currently active

idbIncidentType

Incident Type. Feeds the IncidentTypeID field in the idbIncidents Table.

Field Name Data Type Purpose
IncidentTypeID Autonumber Primary key
IncidentType Text Type of incident
Active Yes/No Signifies if row is currently active

idbAnatomicalLocation Table

Field Name Data Type Purpose
AnatomyID Autonumber Primary key
AnatomicalLocation Text Location of Injury
Active Yes/No Signifies if row is currently active


Changes

10/2004

The International Incident Beta by OutdoorEd.com and OutdoorSafety.org

Comments | Send to a Friend
©2000 - 2006 Outdoor Ed LLC