オープンソースになった Fastladder の ER 図を描いてみた

  Livedoor の Fastladder がオープンソースになったということで、勉強を兼ねて ER 図を描いてみました。


  (クリックで大きくなります)

  使ったツールは DBDesigner 4 (日本語版) です。
  DBDesigner 4 では、SQLite 3.x のデータが読めないようなので、SQLite ODBC Driver を使って、ODBC で読み込み、リバースエンジニアリングしました。

  テーブルの定義はソースを見ながら作成中ですが、あまり Ruby が分かっていないので時間がかかりそうです。。。そのうち公開します。

- Fastladder Open Source
  http://fastladder.org/

PHP 4 の --enable-versioning はトラブルの元か?

  PHP 3 と PHP 4 を共存させる場合に,configure オプションに --enable-versioning を指定します.
  実はこれが思わぬ落とし穴になる場合があります.

  それは,DSO で拡張モジュールが動的にロードできないというものです.
  PHP 4.4.4 + Apache 1.3.37 on Solaris 10 x86 の環境なので,もしかしたら環境依存かもしれません.

  コンパイル・インストールはうまくいきますが,Apache を再起動すると以下のようなエラーが出ます.

- SQLite の場合

PHP Warning:  Unknown(): Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20020429/sqlite.so' - ld.so.1: httpd: fatal: relocation error: file /usr/local/lib/php/extensions/no-debug-non-zts-20020429/sqlite.so: symbol executor_globals: referenced symbol not found in Unknown on line 0

- Xdebug の場合

Failed loading /usr/local/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so:  ld.so.1: httpd: fatal: relocation error: file /usr/local/lib/php/extensions/no-debug-non-zts-20020429/xdebug.so: symbol zend_compile_file: referenced symbol not found

  CLI 版では,全く問題なくロードできるので,原因が全然分かりませんでした.
  これらのエラーが出る場合は,--enable-versioning を外して PHP 4 を再コンパイルするとうまくいくと思います.

  もはや,PHP 3 を共存させることは皆無に等しいと思うので,--enable-versioning のことは忘れてしまったほうがよさそうです.

  参考までに --enable-versioning をマニュアルを見てみると,

--enable-versioning

   要求されるシンボルのみをエクスポートします。 詳細な情報は INSTALL を参照ください。
--enable-versioning

   Solaris 2.x および Linux が提供するバージョン管理機能を 有効にします。PHP 3 限定です!

  とあります.

- Configure オプション
  http://www.php.net/manual/ja/configure.php

- ref.: Blog::koyhoge - [PHP] --enable-versioningを止めるの巻
  http://d.hatena.ne.jp/koyhoge/20061213/1165999933

SQLite で auto-increment なフィールドを作成する方法

  PHP のマニュアルの sqlite_last_insert_rowid の項目を見ていたら

Tip: You can create auto-increment fields in SQLite by declaring them as INTEGER PRIMARY KEY in your table schema.

  つまり,SQLite で auto-increment なフィールドを作りたければ,

INTEGER PRIMARY KEY

  を指定してあげればいいらしい.

  このような記述を見つけたのでテストしてみた.

- SQLite 2.x の場合

$ sqlite test.db
SQLite version 2.8.16
Enter ".help" for instructions
sqlite> CREATE TABLE a (a INTEGER PRIMARY KEY, b TEXT);
sqlite> INSERT INTO a VALUES (NULL, 'test');
sqlite> INSERT INTO a VALUES (NULL, 'test2');
sqlite> INSERT INTO a VALUES (NULL, 'test3');
sqlite> SELECT * FROM a;
a           b
----------  ----------
1           test
2           test2
3           test3

  SQLite 2.8.16 ではうまくいった.
  では,INTEGER PRIMARY KEY に NOT NULL を指定するとどうなるか.

sqlite> CREATE TABLE b (a INTEGER NOT NULL PRIMARY KEY, b TEXT);
sqlite> INSERT INTO b VALUES (NULL, 'test');
sqlite> INSERT INTO b VALUES (NULL, 'test2');
sqlite> INSERT INTO b VALUES (NULL, 'test3');
sqlite> SELECT * FROM b;
a           b
----------  ----------
1           test
2           test2
3           test3

sqlite> INSERT INTO b (b) VALUES ('test4');
sqlite> SELECT * FROM b;
a           b
----------  ----------
1           test
2           test2
3           test3
4           test4

  これもうまくいく.

- SQLite 3.x の場合

$ sqlite3 test.db3
SQLite version 3.1.3
Enter ".help" for instructions
sqlite> CREATE TABLE a (a INTEGER PRIMARY KEY, b TEXT);
sqlite> INSERT INTO a VALUES (NULL, 'test');
sqlite> INSERT INTO a VALUES (NULL, 'test2');
sqlite> INSERT INTO a VALUES (NULL, 'test3');
sqlite> SELECT * FROM a;
a           b
----------  ----------
1           test
2           test2
3           test3

  SQLite 3.1.3 の場合も 2.x と同様にうまくいく.
  INTEGER PRIMARY KEY に NOT NULL を指定するとどうなるか.

sqlite> CREATE TABLE b (a INTEGER NOT NULL PRIMARY KEY, b TEXT);
sqlite> INSERT INTO b VALUES (NULL, 'test');
sqlite> INSERT INTO b VALUES (NULL, 'test2');
sqlite> INSERT INTO b VALUES (NULL, 'test3');
sqlite> SELECT * FROM b;
a           b
----------  ----------
1           test
2           test2
3           test3

sqlite> INSERT INTO b (b) VALUES ('test4');
sqlite> SELECT * FROM b;
a           b
----------  ----------
1           test
2           test2
3           test3
4           test4

  こちらもうまくいく.

- まとめ

INTEGER NOT NULL PRIMARY KEY

  でも

INTEGER PRIMARY KEY

  どちらでも OK.

- sqlite_last_insert_rowid
  http://www.php.net/sqlite_last_insert_rowid

- 追記
  2.8.16 の場合を修正.NOT NULL を指定してもうまくいった.

オープンソースな ER 図モデリングツール DBDesigner

  http://www.fabforce.net/dbdesigner4/

  MySQL,SQLite,Oracle,MSSQL,ODBC 接続に対応している.
  リバースエンジニアリング機能で既存の DB の現状把握にも役に立ちそう.
  ライセンスは GPL.

- DBDesigner4 Manual (日本語)
  http://www.aglabo.com/agl/proevo/software/fabforce/

- 実践的データモデリング入門 DB Magazine Selection [Books]:
  4798103853
  amazon.co.jp 詳細ページへ
  真野 正 (著)
  翔泳社
  ISBN: 4798103853
  2003/03
  2,520 円

- データモデリング基礎講座―データベース設計を楽しもう!DB Magazine Selection [Books]:
  4798101109
  amazon.co.jp 詳細ページへ
  根本 和史 (著)
  翔泳社
  ISBN: 4798101109
  2001/11
  2,310 円

SQLite Makefile for Visual C++ 2003

  http://www.elemental-programming.org/epwiki/SQLID-SQlite%20Makefile.html

  なんとなく必要になったので.

PostgreSQL の独自機能 VACUUM は,SQLite でも使える

- Query Language Understood by SQLite: VACUUM
  http://www.sqlite.org/lang_vacuum.html

SQLite の調査

- 各種ライブラリとか
o PHP Windows 版の拡張ライブラリ最新版.php_sqlite.dll
  http://snaps.php.net/win32/PECL_STABLE/
o SQLite 有効活用計画 (UTF8 <-> SJIS のラッパー)
  http://wiki.manoeuvre.net:8080/?SQLite%CD%AD%B8%FA%B3%E8%CD%D1%B7%D7%B2%E8
o Delphi SQLite Components
  http://www.aducom.com/sqlite/
o SQLite Java Wrapper/JDBC Driver
  http://www.ch-werner.de/javasqlite/

- フロントエンドっぽいもの
o SQLite Database Browser
  http://sqlitebrowser.sourceforge.net/
o SQLite Control Center
  http://bobmanc.home.comcast.net/sqlitecc.html
o SQLite Control Center 日本語版
  http://www.takke.jp/prog_other.html#sqlitecc
  SQLite3 も扱える.
  日本語が通る.

- 資料とか
o Date And Time Functions
  http://www.sqlite.org/cvstrac/wiki?p=DateAndTimeFunctions
o SQLite Optimization FAQ
  http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html

- 移行に関するもの
o MySQL 2 SQLite
  http://perlmonks.org/?node_id=150476
o Version 2.x から Version 3.x に移行

sqlite OLD.DB .dump | sqlite3 NEW.DB

  SQLite Version 3 Overview
  http://www.sqlite.org/version3.html

- メモ
o トランザクション
  SQLite は INSERT の前後で BEGIN/COMMIT されるので,大量のデータを挿入するときは
  明示的に,トランザクションを開始する必要がある.

BEGIN;
INSERT INTO table VALUES (...);
INSERT INTO table VALUES (...);
  :
INSERT INTO table VALUES (...);
COMMIT;


o PHP の拡張モジュール,Perl の DBD::SQLite で使用するライブラリのバージョン.
  PHP 拡張モジュール:  2.8.14

$sql = "SELECT sqlite_version()";
$con = sqlite_open('test.db');
$result = sqlite_query($con, $sql);
echo sqlite_fetch_single($result), "\n";


  Perl の DBD::SQLite: 3.0.8

use DBI;

my $sql = "SELECT sqlite_version()";
my $dbh = DBI->connect("dbi:SQLite:dbname=test.db", "", "");
my (@row) = $dbh->selectrow_array($sql);
print $row[0], "\n";


o データ型
  一応あるが,全部文字列として保存されるっぽい.

SQLite ODBC Driver

  http://www.ch-werner.de/sqliteodbc/

SQLite チュートリアル

- SQLite SQLリファレンス (翻訳版)
  http://www.net-newbie.com/sqlite/lang.html

- sqlite コマンドチュートリアル (翻訳版)
  http://www.net-newbie.com/sqlite/sqlite.html

SQLite and PHP

- SQLite and PHP
  http://www.php.net/~wez/SQLite_and_PHP.ppt

  PowerPoint 形式