少なくとも制限が少ないように見えるMyIsamと比較して、db構造を設計しようとすると、innodbは非常に煩わしいと感じます。
たとえば、単純なライブラリシステムを作成したい場合。そして私は4つのテーブルを持っています。
1、tablebook_item
は、book_name、author、publish time、および書籍に関する基本情報を記録します。
2、テーブルbook
。本のアイテムの特定の実際のオブジェクトを表します。したがって、book_itemオブジェクトは多くの本オブジェクトに関連付けることができます。
tag
3、本のタグを表すテーブル。科学、文学、建築などのように。
4、テーブルtag_book_item_relation
。タグをbook_itemsに関連付けます。
したがって、関係は以下のとおりです。
1、私たちは予約する本のアイテムがあります1対多の関係です
2、タグ付けするbook_itemは多対多の関係です。
ここで、テーブルのエンジンはすべてinnodbであることに注意してください 。テーブルを作成しようとすると、失敗します。
Error:
Executing SQL script in server
ERROR: Error 1005: Can't create table 'yet_another_test.book' (errno: 121)
book
ただし、またはMyISAMtag_book_item_relation
にエンジンを変更すると、すべてが正常になります。
したがって、テーブルにengine innodbを使用すると、何が問題になるのでしょうか。book
tag_book_item_relation
SQLスクリプトはここにあります(MySQLワークベンチのフォワードエンジニアリング):
CREATE TABLE IF NOT EXISTS `yet_another_test`.`tag` (
`id` INT NOT NULL AUTO_INCREMENT ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `id_UNIQUE` (`id` ASC) )
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `yet_another_test`.`book_item` (
`id` INT NOT NULL AUTO_INCREMENT ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `id_UNIQUE` (`id` ASC) )
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `yet_another_test`.`tag_book_item_relation` (
`book_item_id` INT NOT NULL ,
`tag_id` INT NOT NULL ,
PRIMARY KEY (`book_item_id`, `tag_id`) ,
INDEX `fk_tag` (`tag_id` ASC) ,
INDEX `fk_book_item` (`book_item_id` ASC) ,
CONSTRAINT `fk_tag`
FOREIGN KEY (`tag_id` )
REFERENCES `yet_another_test`.`tag` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_book_item`
FOREIGN KEY (`book_item_id` )
REFERENCES `yet_another_test`.`book_item` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `yet_another_test`.`book` (
`id` INT NOT NULL AUTO_INCREMENT ,
`book_item_id` INT NOT NULL ,
PRIMARY KEY (`id`, `book_item_id`) ,
INDEX `fk_book_item` (`book_item_id` ASC) ,
UNIQUE INDEX `id_UNIQUE` (`id` ASC) ,
CONSTRAINT `fk_book_item`
FOREIGN KEY (`book_item_id` )
REFERENCES `yet_another_test`.`book_item` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;