To create MySQL tables for each specific user, or generalize tables?

advertisements

I'm running into all kinds of thought problems while planning my database: Outline: The database is a patient database with a large number of patients. Each patient has tons of data, eg: bloodpressure values on different dates.

Questions:

  1. Would it be easier to create tables per patient e.g. "bob_builder_BPvalues" or to create one table for the BP values eg. "BP_values" and then have all the patients values in there linked via foreign keys?

  2. As I have so much data per patient, it does not seem to make sense to mix blood pressure value of each patient into one single table as this would look very messy to a human. Which approach would be faster in terms of processing and sorting through the data?


Let's say you have 10 patients:

With your first approach, you'd end up with 10 different tables always containing the same type of data.

For each query on a single patient, you would have to build a dynamic query joining to the right table:

SELECT ...
FROM patients
INNER JOIN bobby_measures ON ... -- this has to be crafted dynamically each time
WHERE patients.name = 'bobby'

And what if you want to make some stats on some kind of data for a range of dates for all patients ? Querying this becomes a nightmare, even with 10 patients. So guess what happens when you have 1000...

On the other hand, your second choice makes (arguably) human reading of the database more difficult. But being read by a human is not one of the objectives of databases.

With a single patientData table (or as many tables you want, one per datatype if needed, bloodPressure and stuff), everything becomes simpler. You can query any patient using the same query, changing only the patient id, you can make all the queries you want for a range of dates, filtering on some datatype, or whatever.

SELECT ...
FROM patients
INNER JOIN patientData ON ...
WHERE patients.name in ('bobby', 'joe'...)
AND patientData.type = 'blood pressure'
AND patientData.date BETWEEN ... AND ...
-- and so on

Using the right indices on the patientData table(s) and an appropriate presentation layer, all this data becomes totally readable by an average user.