データベースの設計について
現在PostgreSQL(ver 8.4)を使ってちょっとしたシステムの構築を計画していますが、データベースの設計に関して広くアドバイスを頂きたいです。
ユーザーの入力データをDBで効率よく管理したいと考えています。
例えば、次のようなテーブルを作るとします。
userテーブル
id | name
---+-------------
1 | 山田太郎
2 | 高橋次郎
.. | .............
.. | .............
emailテーブル
id | address
---+------------------------------
1 | yamada@mail.com
2 | takahashi@mail.com
.. | .................................
.. | .................................
この様な複数のテーブルにユーザーの入力を受け、1対1に対応するIDを振って名前やアドレスなどのデータをリアルタイムで挿入していく場合、どのようなテーブルを用意し、プログラムを組むのが適切なのでしょうか?
具体的には、PerlでCGIをつくり、ブラウザ上などからユーザーの入力したデータを取得してPostgreSQLに次々挿入していく形にしようとしています。
具体的なPerlのコードを書いていただけると助かるのですが、他の言語のコードでも一向に構いません。
今のところ、自分で考えたものとしては、
create table user(
id serial,
name text);
create table email(
id serial,
address text);
とテーブルを用意し、
Perlコードの概要は
use DBI;
# *実際にはユーザーの入力値から値を得る
$input_user = 'name_hogehoge';
$input_email = 'address_hogehoge@mail.com';
# DBとの接続
$dbh = DBI->connect("dbi:Pg:dbname=hogehoge", ......);
# プレースホルダの準備
$sth_user = $dbh->prepare("INSERT INTO user (name) VALUES(?)");
$sth_email = $dbh->prepare("INSERT INTO email (address) VALUES(?)");
# SQLの実行
$sth_user->execute("$input_user");
$sth_email->execute("$input_email");
# コミット
$dbh->commit;
といった感じで考えていました。しかしidの対応が確実に取れるかなど不安な点がありますので、アドバイスいただけたらと思います。
もちろんこの方法に固執する必要はなく、結果的に同じようなテーブルが得られれば問題ないです。
長々と失礼致しました。
お礼
ありがとうございます。 物理設計は、やはり少し後の工程なのですね。 今、まだテーブル定義の工程だという認識なので、ハードウェアの設計部隊が「早く物理設計を」というのは、ちょっと焦っているということですかね。 もう少し、整理してみます。