DL, Yep, I see what your saying. In my application it may work fine, but in larger applications where things may change, it would be easier to do it with the 3 tables.
Thanks ----- Original Message ----- From: "DL Neil" <[EMAIL PROTECTED]> To: "Beauford.2003" <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]> Sent: Tuesday, December 03, 2002 7:56 AM Subject: Re: Table setup question > Beauford, > > > OK, I get it now. I thought there would need to be duplication in the > > AlbumSonglist DB. > > =indeed, the process of 'normalisation' (as mentioned earlier) helps to > ascertain when and where 'duplication' is allowed/beneficial/should not > happen. > > Just one other question though. What is the > > difference/benefits of doing it this way, than the way I have it. > Currently > > I use two tables - the songlist table includes 2 id fields (one that > > corresponds with the album title, and one that is used for the song > title). > > The difference between what you have said and what I have is that I have > > duplicated the actual song titles instead of a pointer to the song title > > This way I have eliminated one table. > > =try wording a query to get from album to song title, and then another query > starting from song title and working to album. That's always a good test of > two-way relationship situations. > > =if you have a pointer repeated then (usually) it will take up less storage > space than a repeated song title. OTOH getting rid of a table and the join > in each query will speed up processing time/throughput (by a v.small > amount)... > > =if some data ever changes (admittedly I can't see that it would in your > application - but you're the subject matter expert), eg someone remixes a > song, so to be more precise you want to modify "Leila" to have "Leila - > original" and "Leila - remix" as two different entries in the db; then how > easy would it be to go through the song title data and make that change? In > the m-m model the change would be needed only once (the Song Title tbl - all > else unaffected). In your model, you would need to be sure that you changed > every case - and without knowing how many changes is 'enough'! (now apply > this to customer records and people changing addresses and you'll see > why/which is the 'industry standard' approach). > > =however the ultimate answer to your question is: if it works for you/your > users, then it is 'right'! > > > Thanks again, Beauford > > =hope it helps you along your way to MySQL expertise, > =dn > > > > ----- Original Message ----- > > From: "DL Neil" <[EMAIL PROTECTED]> > > To: "Beauford.2003" <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]> > > Sent: Monday, December 02, 2002 10:41 AM > > Subject: Re: Table setup question > > > > > > > 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 > > > > > > > > > > > > > > > --------------------------------------------------------------------- > 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