jdtoronto has asked for the wisdom of the Perl Monks concerning the following question:

Esteemed Monks,

My webapp continues to grow and I would appreciate any comments monks might have on the use of INNODB tables in MySQL.

The major reason I am considering them to provide what is essentially a 'super ENUM' operation. I want to be able to define a series of say 'user-types' which I can change and using the 'ON DELETE CASCADE' action I can delete all users who have the user-type which is being deleted. Alternatively I can use the 'ON DELETE SET NULL' and then remove the users with the appropriate set to NULL as a scheduled admin task in the quiet time.

I can see one problem: It does not seem that Class::DBI could be used for manipulations where a foreign key is involved as it will atempt to bypass the referential integrity features of the InnoDB tanble type.

Any and ALL comments (bricks, rotten tomatoes and mouldy socks included) would be welcome!

jdtoronto

Replies are listed 'Best First'.
Re: Class::DBI with MySQL INNODB tables
by perrin (Chancellor) on Nov 26, 2003 at 23:27 UTC
    It does not seem that Class::DBI could be used for manipulations where a foreign key is involved as it will atempt to bypass the referential integrity features of the InnoDB table type.

    I can't imagine what you mean by this. I just finished a project using Class::DBI and InnoDB with no problems.

    Foreign key constraints are checked when you try to insert or update a column that refers to one. Class::DBI doesn't change this behavior. An invalid value will result in a DBI exception.

      In this node: Re: Class::DBI Intro, dbwiz had the following to say in response to a tutorial Class::DBI Intro:
      The delete method is rather inefficient. When called, Class::DBI will issue one DELETE statement for each row in your table. Instead of producing
      DELETE FROM page WHERE user_id = 1 DELETE FROM user WHERE user_id = 1
      It does
      DELETE FROM page WHERE page_id = '1' DELETE FROM page WHERE page_id = '2' DELETE FROM page WHERE page_id = '3' DELETE FROM page WHERE page_id = '4' DELETE FROM page WHERE page_id = '5' DELETE FROM user WHERE user_id = '1'
      which can be quite long for large data sets. The sad thing is that, even if I use a database that enforces referential integrity, Class::DBI will still override the database features and issue the same DELETE statements. In your example, if you replace the table definition to use the InnoDB table type, adding
      FOREIGN KEY (user_id) references user (user_id) ON DELETE CASCADE, KEY user_id (user_id) # and replace "MyISAM" with "InnoDB" for both tables
      You can then get the same behavior with
      %dbh->do("DELETE FROM user WHERE user_id=1")
      and the database engine will take care of cascade deletiing the appropriate records in "page".
      This is where I got my info from. The suggestion is obviously that Class::DBI will issue a series of deletes inefficiently over-riding the ON DELETE constraint. I haven't tried it yet, but from my reading you are correct about the INSERT and UPDATE constraints.

      I would value your comments on the DELETE case as well!

      jdtoronto
      PS Do you know of any examples I could look at of multi-table JOIN's in Class::DBI? ..j

        I think he's just saying that Class::DBI implements its own "delete on cascade" feature, and it isn't as effeicient as what the database can do. I don't think this will be a problem, since Class::DBI will simply not find anything to delete if you have your database do the cascade. And again, Class::DBI definitely can't violate any integrity constraints.