Dear module maintainers,

I would like to become a contributor.

My name is Giuseppe Maxia

The username I would like to use is GMAX

My e-mail address is [EMAIL PROTECTED]


I have written a module to facilitate the normalization of database tables.
In short, it is an object that, given a short description for the normalization task to
accomplish, will generate the necessary SQL code for getting the job done.


Example: Given a table MP3 with fields 

     +----------+-------------+------+-----+----------+----------------+
     | Field    | Type        | Null | Key | Default  | Extra          |
     +----------+-------------+------+-----+----------+----------------+
     | ID       | int(11)     |      | PRI | NULL     | auto_increment |
     | title    | varchar(40) |      | MUL |          |                |
     | artist   | varchar(20) |      | MUL |          |                |
     | album    | varchar(30) |      | MUL |          |                |
     | duration | time        |      |     | 00:00:00 |                |
     | size     | int(11)     |      |     | 0        |                |
     | genre    | varchar(10) |      | MUL |          |                |
     +----------+-------------+------+-----+----------+----------------+

We can transform from 1st to 2nd normal from using these instructions:

         use Normalizer;
        # passing username and password explicitly
        my $norm = Normalizer->new ({
            DSN           => "DBI:mysql:music;host=localhost"
            username      => "itsme",
            password      => "secret",
            src_table     => "MP3",
            index_field   => "album_id",
            lookup_fields => "artist,album,genre",
            lookup_table  => "tmp_albums", 
            dest_table    => "songs",
            copy_indexes  =>  1,
            simulate      =>  1
         });
         $norm->do();

The above instructions will generate this SQL code (MySQL specific):

            DROP TABLE IF EXISTS tmp_albums;
            CREATE TABLE tmp_albums (album_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
            artist varchar(20) not null,
            album varchar(30) not null,
            genre varchar(10) not null, 
            KEY artist (artist), KEY album (album), KEY genre (genre));

            INSERT INTO tmp_albums 
            SELECT DISTINCT NULL, artist,album,genre FROM MP3;

            DROP TABLE IF EXISTS songs;
            CREATE TABLE songs (ID int(11) not null auto_increment,
            title varchar(40) not null,
            duration time not null default '00:00:00',
            size int(11) not null, 
            album_id INT(11) NOT NULL, 
            PRIMARY KEY (ID), KEY title (title), KEY album_id (album_id));
 
            INSERT INTO songs SELECT src.ID, src.title, src.duration, src.size, 
album_id 
            FROM MP3 src INNER JOIN tmp_albums lkp 
                    ON (src.artist =lkp.artist and src.album =lkp.album 
                            and src.genre =lkp.genre);

The table tmp_albums can be further normalized using the same technique.

The module is working, has been tested with huge tables (> 1_000_000 records), 
it is already fully documented and the only thing it is missing is a reliable name.
I am not sure if I should ask for a new namespace on its own or a namespace under DBI
or even under DBD::mysql.
I hope to find out soon with some user group advice.


Thanks in advance
Best regards

Giuseppe Maxia



Reply via email to