Fou-Lu - thank you for the very thorough reply.
I have a couple more questions if you wouldn't mind? Plus I'll further explain my set up.
The system is for displaying karaoke songs to singers on their mobile phones. There will be one drop down menu that allows them to select Genres, or decades or duets. So essentially, decades will become genres, starting at 'pre-50s', '60s' etc, as will duets.
The reason I'm piling them all in together is that there is limited space on mobile phones, and I am happy with adding just one more user input option to the screen to compliment the other essential input options I already have.
Although this limits the search options (eg all 80s songs), I think the simplicity of having less user input options to deal with makes sense, especially as people are usually drinking while operating!
From a karaoke host's point of view, giving your user's the option of choosing '80s songs', or 'duets', or 'love songs' is a huge step above having all those songs mixed up in one hard copy book, and from experience, I've found that people ask for those types of books anyway eg 'do you have a duets book' or 'do you have a love songs book' - they never ask for 'a rock song duets book from the 80s'.
So bearing that in mind, plus the following info below, what would be a better way to set up tagging?
Re the many to many relationship for tagging, in my system book owners can tag their songs independently from other owners. So the main library that contains all the songs has a many to many relationship with the book owners, but I don't want to set up a many to many tagging relationship between the main library and tags, as owners will tag the same song differently. That's why I want to have the tagging data attached to the table that holds the owners-songs relationship.
Other question is - you mentioned that option 2 isn't scalable? That concerns me, as I have that option in place to record which of 5 books (karaoke shows can have 5 books per account) a song belongs to. How is it not scalable?
eg table columns (where the book columns are char(0) recorded as either "" or null to reduce data size:
userID | songID | book_1 | book_2 | etc
Thanks again Fou-Lu