Back to Table of Contents

How openXdata stores your data

In a MySQL database

All the data you collect in openXdata is stored in the MySQL database that you setup in the first step. It is worth noting here that openXdata (the software) does not do anything to secure your database for you, you must take your own steps to ensure the integrity and security of your database (and your backups). In addition openXdata (the organization) cannot see or access or control your data - it is yours to own, use and protect.

Inside the database, it goes into two or more places:

  1. standard table: form_data
  2. standard table: form_data_version (only used when data is edited)
  3. custom table: table of data per form
  4. custom table: table of data for any repeat questions (only when form has repeat questions)

form_data

The table form_data stores the raw xml of your data in the column data.

The xml for your data will contain all of the fields in your form and any data you've stored, for example:

<?xml version="1.0" encoding="UTF-8"?>
<example_study_sample_form_v1 formKey="example_study_sample_form_v1" id="1" name="Sample Form_v1" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<patient_id/>
<title/>
<first_name/>
<last_name>Testing Form 1</last_name>
<start_time/>
<endtime>09:49:27 PM</endtime>
</example_study_sample_form_v1>

Each data entry is given a unique ID, and it retains that ID when you edit it.

The version of your data entry in the table form_data will be the latest version of that particular data entry

form_data_version

The table form_data_version stores old versions of the data when a data entry is edited. It also includes information useful for audit trails like who changed the data and when.

custom table

For each form, a unique table, or tables is created.

These tables have the same name as the form version binding or the repeat question binding. (See the Glossary for more information on bindings)

These tables have the data broken out into columns with the column headings being the question bindings.

In 1.16 there are some protections to prevent a clash of table names but they can still happen. In particular:

  • Importing a form that already exists in the database
  • Creating a repeat question with the same binding