Beauford, [please reply to the list - there are always others 'lurking' who will learn from the discussion (and use of the archives is a wonderful dream...)]
You are correct, there will be duplication in the AlbumSong table - but not within one field, only within one column. Album will consist of a unique ID (IDA) and each Title will, one assumes be unique (unless two groups use the same name - I guess that must be possible). Similarly Songlist will also consist of a unique ID (IDS) and once again, one assumes that any repetition of title will be two different songs that share the same name. These two ID 'uniqueness' rules must apply for the next to work, ie you will most likely define them as PRIMARY KEY columns. The 'translation' table, breaks the 'unique' 'rule', "So if song Q apears on albums A, C, and E" as you ask, then we will see: AlbumSong IDA IDS 1 1 2 1 3 1 Note that while "1" repeats in AlbumSong, it does not repeat (a) in Songlist, nor in (b) one row/field of AlbumSong, eg IDA IDS 1,2,3 1 THE ABOVE IS TOTALLY WRONG!!! In the case of AlbumSong the table will not be able to have a PRIMARY KEY column(s), but each of the individual columns should probably be INDEXed for read-speed. Be aware that AlbumSong contains no real 'data' from an end-user perspective. It is a table made up purely of 'links' or 'keys' or 'IDs' to the other two tables. The Album and Songlist tables do all the 'data' work, AlbumSong does all the 'heavy lifting' to relate Album's data to Songlist's, and/or vice-versa. Apologies if this was not clear, first time round, =dn > DL, > > OK, that helps a lot, but I am still confused. I am still struggling with > how you can not have duplication in at least one of the tables. A diagram > here may help. So if song Q apears on albums A, C, and E - I don't quite > understand how AlbumSong is going to be able to know which songs are > duplicated without duplication of ID's. (There are 500 songs and only 36 > albums). > > Thanks > > Album Songlist AlbumSong > > IDA TITLE IDS Song IDA IDS > > 1 A 1 Q ? ? > 2 B 2 R ? ? > 3 C 3 S ? ? > 4 D 4 T ? ? > 5 E 5 V ? ? > ? > ? > ? > ? > ? > ? > > > > ----- Original Message ----- > From: "DL Neil" <[EMAIL PROTECTED]> > To: "Beauford.2003" <[EMAIL PROTECTED]>; <> > Sent: Monday, December 02, 2002 4:32 AM > Subject: Re: Table setup question > > > > Hi Beauford, > > > > You are on the right track. Yes you should remove the songs to a separate > > table. If you merely duplicate the first example (below) in two tables you > > have created a "one-to-many" relationship between the Album table and the > > Songs table - one album has many songs on it. Your query code applies. > > > > However the Songs table still has duplication in it, eg 3.song appears > > thrice, and we can't have that! The problem is, if you cut down the Songs > > table entries so that 3.song appears only once, how do you link to > multiple > > Albums? > > > > So now you are into a "many-to-many" relationship between the Album table > > and the Songs table - one album has many songs on it AND one song may > appear > > on several albums. Problem! > > > > You should not have a field with 'repetition' within it, eg for each album > > hold two fields: ID, and Songs - where songs is a list of IDs/titles. This > > is not 'relational'. You can read up about a process known as > > "normalisation" which teaches a basic three step process (some go to more > > than three steps, but let's learn to walk first...) This normalisation > > process helps to organise data into 'sets', and as RDBMS/SQL work on sets > of > > data/use set theory to drive events, this is the way to go... > > > > So that said, let's proceed. Yes you should set up the song table to have > > columns such as ID and Title. The ID should be unique and each Title > should > > appear at most once within the table. > > (It may help to draw a diagram here, with boxes representing tables, split > > into columns and rows, and with arrows depicting relationships between > > tables and the individual data items sitting in col-row combinations) > > > > To handle the m-m relationship, create another table and place it 'in the > > middle' - to act as a 'translator' of the m-m relationship. This table > will > > contain AlbumID and SongID columns, and the data fields contained will NOT > > (necessarily) be unique. > > (draw another diagram to compare with the above/initial format) > > > > Now you can start from Album and code a join to the 'translator' table to > > find the IDs of every song appearing on the album, and then join any > 'hits' > > from that 'relationship' to the Songs table to realise the titles, etc, > > detail. > > > > Conversely, you can start at the Songs table and by joining to the > > 'translator' table work out which Album(s) a song appears on by AlbumID, > and > > then join to the Album table to find out titles and other album details. > > > > Some people start from card-box/shoe-box databases (which are really > ordered > > files), and others from 'DBMS' that only 'relate' two tables at a time. If > > having multiple joins looks a bit 'hairy' to you, do not fear, this is > what > > relational databases are all about, and joins featuring five to ten tables > > are quite 'routine'. MySQL will have no trouble performing (the logic, and > > at speed)! > > > > Regards, > > =dn > > > > > > > I have a database of albums by a group and I want to be able to search > on > > > this table to find out what songs are duplicated on what albums (there > are > > > 36+ albums). The problem is how do I set up the database. > > > > > > Example: > > > > > > Album1 has 3 songs. 1.song, 2.song, 3.song, 4.song > > > Album2 has 4 songs. 4.song, 5.song, 6.song, 3.song > > > Album3 has 4 songs. 7.song, 8.song, 1.song, 3.song > > > > > > So 3.song appears on all 3 albums. > > > > > > Currently I have it set up with two tables as shown below, but I am > > thinking > > > there has to be a better way to do this than to duplicate the name of > the > > > song three, four, or five times in the table. > > > > > > Table AlbumName > > > > > > Album ID > > > ==== == > > > Album1 1 > > > Album2 2 > > > Album3 3 > > > > > > Table SongTitle > > > > > > Song ID > > > === == > > > 3.song 1 > > > 3.song 2 > > > 3.song 3 > > > 7.song 3 > > > etc. > > > etc. > > > > > > So basically my search is - SELECT Album, Song FROM AlbumName, > SongTitle > > > WHERE AlbumName.ID=SongTitle.ID; > > > > > > Given the setup above, is there a way that I can put in the SongTitle.ID > > > field that song appears on more than one album. Maybe something like: > > > > > > Song ID > > > === == > > > 3.song 1, 2, 3 > > > > > > But then what would my search be. > > > > > > Sorry for the length of this, but I am learning MySQL and trying to get > a > > > handle on all of it. My way works, but I'm sure there has to be a better > > > way. > > > > > > Any thoughts are appreciated. > > > > > > TIA, Beauford > > > > > > > > > > > > --------------------------------------------------------------------- > > > Before posting, please check: > > > http://www.mysql.com/manual.php (the manual) > > > http://lists.mysql.com/ (the list archive) > > > > > > To request this thread, e-mail <[EMAIL PROTECTED]> > > > To unsubscribe, e-mail > > <[EMAIL PROTECTED]> > > > Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php > > > > > > > > > > > > --------------------------------------------------------------------- > > Before posting, please check: > > http://www.mysql.com/manual.php (the manual) > > http://lists.mysql.com/ (the list archive) > > > > To request this thread, e-mail <[EMAIL PROTECTED]> > > To unsubscribe, e-mail > <[EMAIL PROTECTED]> > > Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php > > > > > > > --------------------------------------------------------------------- Before posting, please check: http://www.mysql.com/manual.php (the manual) http://lists.mysql.com/ (the list archive) To request this thread, e-mail <[EMAIL PROTECTED]> To unsubscribe, e-mail <[EMAIL PROTECTED]> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php