DBコンバータへの道(2)

<< 戻る   トップ >>

多対多の関係構築が存外にうまくいったので、一対多の関係を組み込む。まず、トラックバックの送信記録である ping については、article と url を複合キーにして、article を article.id を参照する外部キーに設定する。

トラックバックの受信記録である trackback は、独自のプライマリキー id を持っている。受信記録のみを取り扱うために作られたキーと思われるが、果たして必要なキーなのだろうか。記事番号と、参照元の URL のある記事に対して、特定の URL から複数回のトラックバックがかかるということがありうるだろうか。

送ったトラックバックに不具合があって、訂正のために再送したい、と思うことがある。この場合は前のトラックバックに上書きをしてくれればよいのであって、別のトラックバックとして記録してもらいたいわけではない。他にも非常にまれなケース(同じ記事を異なった文脈で参照たなど)で複数トラックバックの可能性がある。複数トラックバックをどう扱うべきなのだろうか。

とりあえず livedoor のブログで、同じ記事同士の組み合わせでトラックバックを繰り返してみた。繰り替えしただけ登録される。あまり深く考えない方がよいのか。もし id を使わないならば、url と、recieved ( datetime ) の複合キーにするという手がある。しかし、こうなってくるとそのまま素直に id を使った方がよさそうだ。したがって、trackback も ping と同じようにarticle を article.id を参照する外部キーに設定する。

上記の段落を書いてからおおむね2時間が経過した。実は、MySQL での外部キー設定がなかなかうまくいかなかったのだ。まず、ping の複合キーについては、データ型に TEXT を用いている url カラムの文字数を指定する必要があり、とりあえず 128文字に制限した。

ALTER TABLE ping   ADD CONSTRAINT ping_pk PRIMARY KEY ( article, url(128) );

外部キーには苦戦した。原因その1は、制約名である。最初、既存の制約名を使ってしまったのでエラーとなった。

誤: ALTER TABLE trackback ADD CONSTRAINT fk_article FOREIGN KEY ( article ) 
        REFERENCES article ( id );
正: ALTER TABLE trackback ADD CONSTRAINT fk_trackback_article FOREIGN KEY ( article ) 
        REFERENCES article ( id );

それでも ping 表に外部キー制約をかけられない。MySQL の "1452 - Cannot add or update a child row:" エラーが出る。Stack Overflow :alter table add foreign key fails によれば、データの矛盾が生じているとのことだ。ping テーブルには存在するのに、article にない記事番号 (id) があるとのこと。調べてみると、編集に失敗して破棄した記事からの ping があったので、これを廃棄した。幸い両方ともセルフトラックバックで、他所様には迷惑をかけたりしていないようだ。幽霊 ping を削除して、制約名に (またしても) 引っかかり、こけつまろびつようやく外部キー制約をかけることができた。

これだけでけっこうな時間を浪費してしまったので、NetBean いじりは明日以降。


作成: 2013-07-30 09:17:38.0更新: 2013-07-30 10:49:54.0
http://museo-anonimo.jp/nanban/?id=1226,http://museo-anonimo.jp/nanban/tr/1226