There are two ways lookup data can be handled, and neither one is necessarily better. The term "lookup table" for this discussion is a table with a single field of information. You have 3 ClubOptions, LieOptions, TypeOptions
You can store a foreign key and then always relate back to the "lookup table". Or you can simply store the "lookup value." My point is that the pros and cons of storing the foreign key or the actual lookup value has already been discussed. It is not as cut and dry as others have said. The decision to store a foreign key or store the actual value is based on size of lookup table, complexity of lookup data, how the data is used. Have to ask yourself do you really want to build a bunch of tables just for small lookups? Does the cost of always having to add a join out weigh the cost of storing a text value? Is there a remote chance of needing additional data fields in the future?
So I disagree with those saying you have to add a numeric key and create a relationship. I will however say it is never wrong to do that, but it may not really be worth the extra work
Imagine you have a table with clubs. The only information it stores is a club name. No need for an any ID field since it is never used (except maybe to enforce a sort order)
tblClubOptions
tblClubOptions
| Clubs |
|---|
D |
3w |
3h |
4i |
5i |
6i |
7i |
8i |
9i |
PW |
52W |
56W |
60W |
P |
5h |
If you are confident that you will never want additional related fields (pure single column lookup) then storing the text value is easier. You simply populate a field in your data table with one of the values above. If you want "D" you store "D". However, it seems to always come back to haunt you and you realize you do want additional related information. What if you want at a later date to get a club "group type" field (Wood, Iron, Hybrid, Putter, ...). Or how about a long name display fielsd ("Nine Iron"...)
You do not have to add a join to display your data. The argument that it requires more space is correct, until you get hundred of thousands of records probably not a big deal. The names are not going to change unless they even new types of clubs. In this design relational integrity is not a thing since there is no foreign key. However, you will have to ensure that your combo box has "limit to list" so that you can not add a bogus response and you need to make the field required.
In the second method you do not store the club name value, but the Primary Key. You store 1 in the data table and not "D".
tblClubOptions
tblClubOptions
| ClubID | Clubs |
|---|
1 | D |
2 | 3w |
3 | 3h |
4 | 4i |
5 | 5i |
6 | 6i |
7 | 7i |
8 | 8i |
9 | 9i |
10 | PW |
11 | 52W |
12 | 56W |
13 | 60W |
14 | P |
15 | 5h |
The advantage here is that it is always efficient, you can add additional related fields, you can change the value and update everywhere (5h to 5H or 5Hybrid and all records are updated through the relation.), you can ensure data integrity at the table level. However to simply display data you have to pull in the related table.
When you have a foreign key in a data table storing a primary key, you can add extra layer of data integrity by ensuring relational integrity. This way you can ensure that at the table level only a valid PK can be saved as an FK value in your data table.
Without looking I think I remember you were inconsistent with your lookups. In some cases you saved the lookup value and in some cases you saved a Primary key. It is not wrong, but may be confusing to you and others. I would pick one and be consistent.
("shot type" if you want to list shot types)
One advantage if you have a lot of small lookups and store just the value is that it can be done in a single table. So your three lookups could be combined something like this. You comboboxes pull from tblLookups and filter to the correct Category
tblLookups
tblLookups
| Category | Choice |
|---|
| Shot Type | Tee Shot |
| Shot Type | Approach |
| Shot Type | Penalty |
| Shot Type | Short Game |
| Shot Type | Putt |
| Shot Type | Recovery |
| Club Name | D |
| Club Name | 3w |
| Club Name | 3h |
| Club Name | 4i |
| Club Name | 5i |
| Club Name | 6i |
| Club Name | 7i |
| Club Name | 8i |
| Club Name | 9i |
I have seen this taken to extremes. The user had a table of Priorities with values of 1,2,3,4,5. Then gave these a primary key with values 1,2,3,4,5.
I have seen another user create a lookup table of First Name because they thought it would be more efficient to store a numeric foreign key. The lookup had about 2k records. This required the user to first update the lookup table and then selecting a choice from the lookup table. There was something like 6k data records so only a small percentage of names were repeated.
So the point in your case if you saved lookup values it would be easier and there would absolutely be no noticeable size or efficiency issues. However all the other flexibility issues would be sacrificed for the ease of use.