Reputation: 409
I'm building a database where I have these 2 tables:
1) [users] with the following columns: id, username, password, email (and a few more).
2) [user_profile] which contains more info about the user such as: gender, height, county, languages, etc.
My question is about the second table. What would be a good way to store info in columns that may have more than one answer, such as Language or Pets? Is my schema still a good idea if I have such info stored? My only idea so far is to store the several options together in one column and separate them with something like a '-' character. Later when I pull the info from the DB I'll split the info from these columns that can contain more than one option by the '-'.
Is this a good idea? Is there a better one?
Upvotes: 0
Views: 710
Reputation: 3077
Your proposed solution seems fine as long as you want to do the extra parsing once fetch a row from your table. Though a couple of other options spring to mind. Both will require creating new tables. I'm no expert schema designer so feel free to critique my options.
1) Using languages as an example here, create a Language table that will enumerate all the language options. Then you create one more table to specify the mapping from profiles to languages. So your two new tables are
Language: Language_Id, Language
User_Profile_Language_Mapping: Profile_Id, Language_Id
This way a profile can be associated to as many language as you want by just adding an entry to the User_Profile_Language_Mapping table.
2) Using Pets as the example this time, is to create another table that maps user profiles to pets.
User_Profile_Pets: Profile_Id, Pet
I don't know what info you want to store about a pet but it could be just the pet name, pet type or it could be foreign key into a Pet table where you can specify lots of information about that pet.
I like option 1 for data that you can enumerate all the possibilities (like languages) and I like option 2 for when there could be an unlimited number of possibilities (like pet names)
Upvotes: 1