If this is your first visit, be sure to check out the FAQ by clicking the link above. You may have to register before you can post: click the register link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below.

 
Go Back  dBforums > General > Database Concepts & Design > Database Design assistance please (MySQL)

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1 (permalink)  
Old 02-02-09, 05:53
rhyspatto rhyspatto is offline
Registered User
 
Join Date: Feb 2009
Posts: 2
Question Database Design assistance please (MySQL)

Hey guys, first time poster to dbforums.

I am currently building a database for an online system but seeings this is my first fully designed db i'm having some teething problems.
I cannot figure out how I should create the tables/rows for this example:


I have user_table, which includes user_name, user_pass, user_email, etc.

I have music_genre, which includes just the primary key (genre_id) and the genre_name.


Now, I want my users to be able to have multiple genres assigned to their account. I understand i could restrict users to having, say, 3 genres, and then I just create 3 rows that relate to the genre_id's, but i dont want that restriction.

I figured i could make a row called user_genres and this could be a varchar that is delimiter seperated, allowing nth genres, but i dont think this is good practice, and would probably make any sql queries hell to work with.


Any help is much appreciated,
Regards,
Rhys
Reply With Quote
  #2 (permalink)  
Old 02-02-09, 06:50
mike_bike_kite mike_bike_kite is offline
vaguely human
 
Join Date: Jun 2007
Location: London
Posts: 2,519
Quote:
Originally Posted by rhyspatto
Any help is much appreciated,

Just have these tables :
  • User : user_id, user_name, user_pass, user_email, etc.
  • MusicGenre : genre_id, genre_name
  • UserMusicGenre : user_id, genre_id
Added an id field into user table.
Users can add as many genre rows as they wish.
You'll want to join the tables together to get the info you need.
Don't need user_ at start of all fields or genre_.
Add foreign keys to ensure the users / genres exist in UserMusicGenre.

Mike
Reply With Quote
  #3 (permalink)  
Old 02-02-09, 06:52
healdem healdem is offline
Jaded Developer
 
Join Date: Nov 2004
Location: out on a limb
Posts: 9,246
Quote:
Originally Posted by rhyspatto
Hey guys, first time poster to dbforums.

I am currently building a database for an online system but seeings this is my first fully designed db i'm having some teething problems.
I cannot figure out how I should create the tables/rows for this example:


I have user_table, which includes user_name, user_pass, user_email, etc.

I have music_genre, which includes just the primary key (genre_id) and the genre_name.


Now, I want my users to be able to have multiple genres assigned to their account. I understand i could restrict users to having, say, 3 genres, and then I just create 3 rows that relate to the genre_id's, but i dont want that restriction.

I figured i could make a row called user_genres and this could be a varchar that is delimiter seperated, allowing nth genres, but i dont think this is good practice, and would probably make any sql queries hell to work with.


Any help is much appreciated,
Regards,
Rhys
so consider having an intersection table (which contains details of two, or more foreign keys)

eg
UserGenres
UserID
GenreID
you can have multiple genres for one user ID, multiple user id's for one genre.
so if you want to do a search on Genres you can qucikly find all users who have identified that genre.

you coudl extend the interscetion table to indacet a rating (could be 1..5 indicating dislike/like(, it coudl be a percentage), so you can identify people with similar likes and dislikes, you coudl identify people who may like genre blah, haven't expressed a preference on genre blugh but others who like blah like blugh
__________________
I'd rather be riding my Versys or my Tiger 800 let alone the Norton
Reply With Quote
  #4 (permalink)  
Old 02-02-09, 16:08
rhyspatto rhyspatto is offline
Registered User
 
Join Date: Feb 2009
Posts: 2
Thumbs up

Quote:
Originally Posted by mike_bike_kite

Just have these tables :
  • User : user_id, user_name, user_pass, user_email, etc.
  • MusicGenre : genre_id, genre_name
  • UserMusicGenre : user_id, genre_id
Added an id field into user table.
Users can add as many genre rows as they wish.
You'll want to join the tables together to get the info you need.
Don't need user_ at start of all fields or genre_.
Add foreign keys to ensure the users / genres exist in UserMusicGenre.

Mike

Thanks for the help, this seems like it will do the job, being the most logical. I have started adding user_ and genre_ for example to the start of every row because it seems to fix the issue with reserved words. (eg. I wanted a row called 'state' but i think thats reserved, so made it 'user_state')
Is this bad practice?


Thanks again, much appreciated.



Sorry, another question, I'm also trying to think up a solution so users can select multiple pre-defined genres, but also give them to possibility of entering their own. To do that i thought when they enter a new genre, its added to the genre list. But perhaps the genre table could have a 'genre_approved' type boolean row that defines it as default false. Therefore admin can check what genre has been entered and approve it to prevent any nasty's being entered and automatically visible on the site. Is this a good method?

Last edited by rhyspatto; 02-02-09 at 16:12.
Reply With Quote
  #5 (permalink)  
Old 02-02-09, 17:24
healdem healdem is offline
Jaded Developer
 
Join Date: Nov 2004
Location: out on a limb
Posts: 9,246
adding the table name as a prefix is in my books a BAAAAD idea.
it has its uses when that column is foreign key in another table. so by all menas call it UserID in the foreign key, but call it ID in the user table.

however that is no ore than a naming convention, and there ae as many conventions as there are development departments.

new question new post... thats the normal forum ettiqutte

FWIW: the problem of allowing users to add their own genre's is that you can often find users have a different genre. I found it a problem when connecting to the gracenote music database. the same music may have different genres depending on whether its a UK, US, European or whatever CD/Album. it means there can be a proliferation of genre labels.


however there is a sneaky way of getting round this problem, and thats to have a genre transalation table, where you allow a user to describe their genres as whatever they like, and show them music that is that genre.. the sneaky trick is to have another table that identifies what user uses that genre and someone (probably you) then associates that genre with what your system knows.

so someone could define say the clash as 'old school punk', but your system defines it as punk. you then show any music defined as punk to that user as 'old school punk'. confused you bet.. its a lot of work, especially the associating their terminology with your terminology
__________________
I'd rather be riding my Versys or my Tiger 800 let alone the Norton
Reply With Quote
Reply

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On