[ILUG] Comments from DBA's requested.
John Gay
johngay at eircom.net
Tue May 18 17:49:00 IST 2004
I've been trying to get my head around data normalization. The references I
have are:
MySQL Tutorial by Welling and Thomson
Managing & Using MySQL 2nd Edition from O'Reilly
Of the two, the O'Reilly book is slightly more helpful in explaining
normalization.
I've followed the CD Catalog example but added my own requirements.
I want to track my CD Collection and store info about CD titles, song titles
and artists.
Since each CD contains many songs, I split SONG into a seperate table from CD.
Since artists release many songs and CD's, I split ARTIST into a seperate
table. Now I've this relationship:
ARTIST---<SONG>----<CD
Each song has one and only one artist.
Each artist has one or more songs.
Each song is on one or more CD's.
Each CD contains many songs.
To resolve the many-to-many relationship between SONG and CD I created a
TRACK table to go between SONG and CD. This also serves to store track numbers
that I had overlooked. Now my tables look like this:
ARTIST---<SONG---<TRACK>---CD
And the SQL to create these tables:
CREATE TABLE artist
( artistID int not null auto_increment primary key,
name varchar(50),
) type=InnoDB;
CREATE TABLE song
( songID int not null auto_increment primary key,
name varchar(50),
directory varchar(128),
artistID int not null references artist(artistID)
) type=InnoDB;
CREATE TABLE cd
( cdID int not null auto_increment primary key,
title varchar(50),
) type=InnoDB;
CREATE TABLE track
( cdID int not null references cd(cdID),
trackNo int not null,
songID int not null references song(songID),
primary key(cdID, trackNo)
) type=InnoDB;
I added the directory attribute to song to hold the directory of the mp3/ogg
version of the song, if I had it.
So this is the database for my music collection. Populating it has been
interesting, though. I add the CD entry first, then the ARTIST entry, if one
does not yet exist. Then I need to use artistID when entering the SONG
entries. I then need both the songID and cdID when entering the TRACK
entries. I thought I might be able to use something like:
INSERT INTO song VALUES
(NULL, 'No Reply', NULL, SELECT artistID FROM artist WHERE
name='The Beatles');
but this generates errors due to the SELECT query.This type of notation would
be even more useful when making the TRACK entries, as the songID's get higher
and when I have one song on multiple CD's.
I've also been playing with MySQLCC, which is not a million miles away from
Acess for ECDL purposes. I suppose, with time I'll learn plenty of tips and
tricks. I was just hoping for some comments, criticisms and suggestions from
any DBA's here.
Cheers,
John Gay
More information about the ILUG
mailing list