Designing a database for blood donors

I have had a look at your database and you are definitely on the right track. I have basically brainstormed the concept after the only absolutely essential change listed first. You might well discard some ideas but I would highly recommend the separate address table.

The limit is really your imagination. The importance of the systems analysis of the database purpose cannot be overemphasised in any design and will save a lot of work modifying it later. Talk to the people who use the system to discuss the kind of information they think might be useful.


Donor.BloodType must be an Number field because it is related to BloodType.BloodTypeID which is a number.

A Comment field on the Donor table might be useful to record any general information.

Maybe add a Checkbox to the Donor table to indicate Unvailable. When a Donor has not been able to be contacted by you this box would be ticked. When looking for a donation these records would be sorted to the bottom of the potenial donors. Could save time when it matters most.

Better still record an availability code. 1 = Always, 2 = Usually, 3 = Sometimes, 4 = Rarely, 5 = Deceased or something similar. This way donors can be sorted by who is easiest to find and it may save precious minutes in an emergency.

Inactive donors remain on file but have a low ranking. Althought it might sound crazy to keep dead people on file it can be a useful campaign tool to encourage their children to keep up a family tradition later. Always try to think beyond the immediate purpose because users always do once they start using the database.

The rankings could also be achieved by recording every attempt to contact a donor in a ContactSuccess table and indicating success or otherwise. This would rely on operators using it properly. Probably a bit advanced just yet.


Addresses usually have multiple fields allocated for AddressLine1, AddressLine2, City etc

Multiple address lines facilitate formatting address labels for postal correspondence. This also allows you to search by City which would be quite complicated in a single combined address field.

Since you are using multiple adresses for each Donor the addresses are best moved out into a separate table with multiple records for each donor. This will allow you any number of addresses per donor.

I would also add the phone number for each location to this table incase their mobile is not responding. Someone at the address may be able to advise you as to the donors whereabouts.

The Addresses table might have fields:

DonorID (FK) Identifies the associated Donor.
Address1
Address2
State
City
Phone
Type

The Type field populated with a FK from an AddressType table in much the same way as the BloodType table is related to Donor.BloodTypeID.

It might include the fields like:
1 | Correspondence
2 | Local
3 | Rural
4 | Relation
5 | Other
6 | Redundant

This way you can search for the type of address. For example only local addresses might be shown when the patient condition does not allow time for a journey from the rural region. Many designers never provide a way to delete a recod but simply flag it obsolete. This prevents accidental disasters.

New developers often fear that the database will grow too large if old data is retained but with good design several million records are not a problem.

I would also consider adding a Journey field to this table to indicate how long it would take for the donor to reach the clinic. Closest could be called first in emergency.

A text Comments field in the Address table might be useful too.
For example it might record: Telephone at neighbour's house. Will ring back.

Things like best contact times are useful when the location might be unattended during the day due to work comittements for example.

You might even consider adding a field to record when the person is most likely to be found at this address. Checkbox fields like WeekendOnly can be useful. (Access can recognise days of the week from Dates very easily and knows what day it is currently.)

Maybe later you could consider another table for a searchable series of dates to indicate when they have indicated they will be or are usually at an address but that is probably a bit advanced for you just yet.

In fact the ContactSuccess table mentioned earlier would be connected into the address records and with some advanced programming it could be possible for the database to learn the liklihood of finding a donor at a particular address based on the date and time. But perhaps I am jumping too far ahead now.

However in this case I would definitely add an AddressID PK field to the Address table since the ContactSuccess table would need to relate to it. Probably a good idea to add it now in anticipation of the future.


Usually it is a good idea to reduce the field sizes where possible. In the case of BloodType, field size could be Byte since this is the smallest type (allows for up to 255 values). Although it does not reduce the size of the storage on disk I believe it does reduce the RAM allocated and slightly speeds up the access to records.

Similarly you could reduce the name and address lines from the default 255 to a more appropriate value. This helps keeps users from entering too much into the field for display.

Spaces in field and table names are best avoided so use DonationDate rather than [Date of Donation]. It saves a lot of typing especially those brackets. Indeed avoid space in all onject names including the database filename itself.

BTW, Keep the file name to eight characters maximum for best results on network connections too.
 
By the way, what does "reinforce referential integrity" mean when creating relationships?

Referential integrity means if the PK is changed in a table the Fks in all related records will also be updated.

Similarly with the cascaded deletes. Deleting the record with the PK will delete the related records. Only to be used with extreme caution.
 
This is not correct. Sorry.

Referential Intregity simply means that a Master must exist before a Child.
 
How do I know if I should use a one-to-one, one-to-many, or many-to-many relationship?

A one to one relationship means the two tables have the same number of records for any key. Usually it mean the tables can be combined into one.

A one-to-many relationship means there can be multiple records in a second table for each record in the first table. In my earlier post Donor to Addresses would be a one-to-many relationship as would Donor to Dontation or Donor to Reward.

A many-to-many relationship is where any record in one table can be related any record in another table. For example two tables of trucks and destinations where any truck may visit any destination.

A "join table" is used to form the relationship. This join table has two fields, TruckID and LocationID from the other tables.
 
This is not correct. Sorry.

Referential Intregity simply means that a Master must exist before a Child.

Thanks. Yes I jumped a bit there by describing Cascading Updates instead. Time I went to bed.
 
I was a bit suprised myself.

Normally you do not make mistakes like this.

Sweet dreams.

I have got an hour more ahead of you because I use real time.

Cheers.
 
The following information need to be in the database:

Personal Information:
First Name
Middle Name
Last Name
City Address
Home Address
Date of Birth
Blood Type
ID Number (each pledge 25 member is given a unique ID number)
Contact Number
E-Mail Address

Serial Number and Date of Donation:
Numbering (to count their donations)
Serial Number (each unit of blood their donate is assigned a unique serial number)

Awards:
Type of Award
Date Issued
Date Received

This will be an exciting project. I don't know how formal versus informal you wish to be with your database. If you want a quick informal database, the data you are requesting would seem to be OK.

However, if you wish to have a more fully featured database and provide greater "filtering". You may consider things such as elapsed days since the last blood donation, travel time (distance), diseases, and the medications that a person may have started taking since their last visit (certification). (You may want want to have an on-screen interview form for asking these types of eligibility questions)

What does the Red Cross currently have as a database system? The reason for this question is you don't want (your database) to duplicate existing work/features?

Have you run your proposed database by a doctor and/or the lab technician? What type of information when the potential donor is called would they want concerning matching the donor to the patient that they currently can't get?

What about appointments? You call someone up, they say fine, I will be in at 3PM or something similar. You may want to have the capability to print out the appointment confirmation card that you can hand to the technician who will be drawing the blood.

How much blood will be needed? You may want to have a counter for this. If a lot of blood is needed you will need many donors additionally a certain number may not show-up or prove to be ineligible so you will need to "over-book" the number of donors.

Again, my thoughts go way beyond a simple contact database. So I may be posing questions outside of your intended scope. I wish the best of luck with this project. Happy New Year.

PS: Two additional thoughts. The database should be designed so that it could also be used at any clinic.
You mentioned that your are a student but did not indicate your grade level. In any event you should contact your faculty adviser (assuming you have one) to see if you can get credit towards your educational degree for developing this database.
 
Last edited:
You may consider things such as elapsed days since the last blood donation,

This would not be recorded in a table but calculated on a form or report from the date of the last donation. For donors who have have already contributed before the database is implemented they should have an opening record entered into the Donation table with this date.

One thing I forgot to remind about last night after looking at the database was the field in the donor table for the number of donations before the database was commenced so donors can get credit towards their rewards.

I did describe it in an earlier post.
 
Wow! So many ideas rushing in! :)

I have more questions, but before that I'll give a little more background on the project. The database is primarily for keeping records of the members in the Pledge 25 program. These members are the youth, aged 18 to 25, who pledge to be regular blood donors (donating 3 to 4 times a year) until they are 25.

I am currently a volunteer holding two positions: Area Coordinator for the National Youth Council (the highest body governing youth volunteers in the Philippine Red Cross), and at the same time the President of our College Youth Council. I am also a graduating (fourth year) B.S. Psychology student and will be going into medical school next year.

At present, the Pledge 25 program does not have a national database which in my opinion is one of the reasons why it is still not very effective. Because there is no database, members cannot easily be contacted of upcoming mass blood donations in the area. The number of donations given by members are also not monitored so they are not given their awards.

With regards to the Philippine Red Cross blood services as a whole, AFAIK they do not have a database too. The blood banks still run out of blood and people are still having a hard time looking for donors to get precious blood to their loved ones who are critically ill.

My plan is to implement this database for Pledge 25 members in our College Youth Council first, and maybe eventually it can be adopted for the use of the entire Pledge 25 program (in the national level). I do have members who are studying Computer Science and Information Management, but so far those that I have contacted are busy. I'm still trying to reach others but I feel that I have to take initiative and start working on the database now because with the great need for blood products, time is not really a luxury.

I've come up with a couple of goals for this database to give direction in its formulation:
1. To track down members who can give blood immediately in-case the blood bank runs out of supply.
2. To monitor the number of donations each member has in order to quickly give them their awards.
3. To easily contact members about upcoming mass blood donations in their area.

Thank you all for the support, all this effort is not for me but for all those whose loved ones are in dire need of blood.

And now, onto my additional questions. :D

Maybe add a Checkbox to the Donor table to indicate Unvailable. When a Donor has not been able to be contacted by you this box would be ticked. When looking for a donation these records would be sorted to the bottom of the potenial donors. Could save time when it matters most.

How do I add a checkbox to the Donor table?

Cant the donor's activity be monitored in the DonationRecord table? It already has the dates of the past donations of the donor right?

Addresses usually have multiple fields allocated for AddressLine1, AddressLine2, City etc

Multiple address lines facilitate formatting address labels for postal correspondence. This also allows you to search by City which would be quite complicated in a single combined address field.

Since you are using multiple adresses for each Donor the addresses are best moved out into a separate table with multiple records for each donor. This will allow you any number of addresses per donor.

Since I initially plan to implement this database only in our College Youth Council, that is the reason why I only put two address fields, one for their city address (the city of our university), and one for their home address. Do you think I should still break down the addresses into multiple fields in a different table?

Usually it is a good idea to reduce the field sizes where possible. In the case of BloodType, field size could be Byte since this is the smallest type (allows for up to 255 values). Although it does not reduce the size of the storage on disk I believe it does reduce the RAM allocated and slightly speeds up the access to records.

How do I reduce the field size?

Referential integrity means if the PK is changed in a table the Fks in all related records will also be updated.

Should I use referential integrity? Can it help in my case?

A one to one relationship means the two tables have the same number of records for any key. Usually it mean the tables can be combined into one.

A one-to-many relationship means there can be multiple records in a second table for each record in the first table. In my earlier post Donor to Addresses would be a one-to-many relationship as would Donor to Dontation or Donor to Reward.

A many-to-many relationship is where any record in one table can be related any record in another table. For example two tables of trucks and destinations where any truck may visit any destination.

A "join table" is used to form the relationship. This join table has two fields, TruckID and LocationID from the other tables.

Are the relationships in my database correct? I'm still confused about this.

Have you run your proposed database by a doctor and/or the lab technician? What type of information when the potential donor is called would they want concerning matching the donor to the patient that they currently can't get?

At present, before a person is able to donate, they have to answer a questionnaire regarding their lifestyle, get their vital signs checked by a nurse, and interviewed personally by a physician. I think they already have enough information about the donor on this level, since this should be done before each donation.

What about appointments? You call someone up, they say fine, I will be in at 3PM or something similar. You may want to have the capability to print out the appointment confirmation card that you can hand to the technician who will be drawing the blood.

I'm thinking the system would probably work in a different way. By the time the database is done, I will have another student as a blood services coordinator. When blood is urgently needed, she will just contact the possible donors and the donors will be the ones to go to the blood bank to donate their blood.

How much blood will be needed? You may want to have a counter for this. If a lot of blood is needed you will need many donors additionally a certain number may not show-up or prove to be ineligible so you will need to "over-book" the number of donors.

How can this be integrated into the database?

I'm sorry for the many questions. I am a pre-med and not a programmer, so everything is really new to me. Again, thank you all for your support in this noble undertaking. :)
 
1. Time to buy a book on Access programming.

2. You will need to clearly define the scope of your project. The advice given, to a degree, may be distracting from your original intent of tracking award points (#2). In terms of a learning experience, focusing on #2 may be best approach until you feel comfortable in tackling objectives #1 & #3.
I've come up with a couple of goals for this database to give direction in its formulation:
1. To track down members who can give blood immediately in-case the blood bank runs out of supply.
2. To monitor the number of donations each member has in order to quickly give them their awards.
3. To easily contact members about upcoming mass blood donations in their area.

3. An issue related to point #2 above relates to the availability of computers and access to a LAN at the clinics. When you get into your other objectives (#1 & #3) you may want to consider multiple user access to the database.

4. Add a Boolean field to the table.
How do I add a checkbox to the Donor table?

5. Don't worry about it for "small" databases.
How do I reduce the field size?

6. Yes. But get a book and/or look-up what that means on the internet.
Should I use referential integrity? Can it help in my case?

7. You will need to create a table to track each emergency event. Additionally this table would be keyed to the patient (recipient). If the doctor says 4 bags of blood are need, the order would be for four. As each confirmation comes in the deficit/surplus would be computed on the display form. Actually, this "table" will be a table + query and referential integrity will be important. Again, for the learning experience, focus on objective #2 until you feel comfortable with branching out.
How can this be integrated into the database?
 

Users who are viewing this thread

Back
Top Bottom