- PR -

DBテーブルとJavaクラスのマッピング

投稿者投稿内容
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2007-04-18 13:48
Javaとデータベースの両方に関係するのですが、ほぼ雑談なのでここにポストします。
RDBのテーブルやカラムの命名規則についてのちょっとした悩みです。

今まで、自分で決められる場合は下記のようなルールに従ってきました。

テーブル名
英単語の組み合わせ
複数の単語は"_"でつなげる
原則として最後は名詞の複数形

カラム名
英単語の組み合わせ
複数の単語は"_"でつなげる

またSQLを記述する際は、予約語は大文字、それ以外は小文字というルールにも従ってきました。

例えば、DBベンダーの情報を格納するテーブルは、次のようなDDLで作成されるわけです。(制約は省略)
コード:
CREATE TABLE database_vendors (
  vendor_id INTEGER,
  vendor_name VARCHAR(100),
  hq_address VARCHAR(100)
);


idとnameのプレフィックス"vendor_"はなくてもいいのですが、よくある属性だと他のテーブルとかぶって一目で識別しづらくなるので、これはよくあるスタイルだと思っています。

さて、このスキーマを利用するアプリケーションをJavaで開発します。
データベースアクセスにはEJB 3.0 JPAを採用することにしました。なので、基本的にはテーブルと1対1になるようエンティティクラスを作ります。

Javaの一般的なスタイルだとこんな感じでしょうか。
コード:
@Entity
@Table(name = "database_vendors")
public class DatabaseVendor {
  @Column(name="vendor_id")
  private int id;
  @Column(name="vendor_name")
  private Stirng name;
  @Column(name="hq_address")
  private String hqAddress;
 :
}



ここから本題。
Javaクラス名とテーブル名、Javaフィールド名とカラム名が(ignore caseで)同じ場合、@Tableと@Columnアノテーションのname属性は省略可能です。何より、名前が同じだと対応関係が明らかなので、分かりやすい!

僕はテーブルをこう定義するべきなのだろうか・・・。
コード:
CREATE TABLE databasevendor (
  id INTEGER,
  name VARCHAR(100),
  hqaddress VARCHAR(100)
);



テーブル名の最後の単語が複数形じゃないのと、"VENDOR_"のプレフィックスがないのはまあ許せるんですが、単語区切りの"_"がないのはちょっとなぁ・・・。
SQLの記述ルール変えて、常にDatabaseVendorやHqAddressなどと書くようにすればいいか・・・。

いや、Javaのほうをデータベースの規則に合わせるという手もあった!
クラス名 Database_Vendors とか。(あり得ない・・・)

通常、RDBMSはテーブル名、カラム名の大文字小文字を識別しなくて、Javaは識別するのが根本的なミスマッチなんですけどね。
あぁ、悩ましい。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-04-18 14:20
なるほど。
DBとJavaでの慣習としている命名規約が違うから起こる問題なのですね。
規則的な変換であるからには機械的な処理をする方法論も取れそうに思いますが…

ところで、日本語でテーブル名・カラム名を付け、
日本語でクラス名・フィールド名を付ける場合は問題にならないのですかね
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 2007-04-18 14:38
 つい最近DBを使いはじめたばかりで純粋にEJB3.0を使ってみた感じでは、RDBの命名に_を使うほうが異常な気がします。
 素人考えでは、カラム名などはJavadocの説明にするような日本語名を記述して、仕様書だけ見ればテーブルがわかるほうがよいと思います。
(日本語が使えないRDBがあるのかということは知らないですが、PostgreSQLでは-を使わなければ問題なさそうです)
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2007-04-18 14:49
なるほど! 日本語を使えばいいのかっ!
・・・と思ったけど、僕はUSの会社で働いているのでした。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-04-18 15:18
私はS2Daoを使っていますが、EJB3.0と同様で名前が同じなら注釈不要です。
ですので、テーブル名、カラム名はJavaと同じルールで命名します。
古い習慣を引きずる必要はないと思うんですよね。

yuzy
大ベテラン
会議室デビュー日: 2002/02/14
投稿数: 117
投稿日時: 2007-04-18 16:11
引用:

日本語が使えないRDBがあるのかということは知らないですが



MySQL 4.1
JDBC Driver : mysql-connector-java-5.0.4
で、カラム名に日本語を使ったら
java.sql.DatabaseMetaData.getColumns()で文字化けしました。
(JDBC Driverのソースを見たらgetBytes()してる個所があったので、
 そこが怪しそうでしたが、私のプロジェクトではなかったので、
 日本語使わないようアドバイスしました。)

Oracleもミドルウェアによっては、問題が発生したりしました。
(最近は使ってないので、どうかわかりませんが)


余計なトラブルに巻き込まれたくなかったら、使わない方が懸命かと思います。
flatline
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 102
投稿日時: 2007-04-19 00:02
引用:

テーブル名の最後の単語が複数形じゃないのと、"VENDOR_"のプレフィックスがないのはまあ許せるんですが、単語区切りの"_"がないのはちょっとなぁ・・・。



Java、RDB の定義に関わらず、単語を"_" で区切ると、どんないいことがあるのかよくわからないのですが。

引用:

通常、RDBMSはテーブル名、カラム名の大文字小文字を識別しなくて、Javaは識別するのが根本的なミスマッチなんですけどね。



RDBMS で、大文字小文字を識別しない、ということは、逆に言えば、vendorId、vendorName と書いてもいいのでは?
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2007-04-19 01:03
引用:

flatlineさんの書き込み (2007-04-19 00:02) より:
RDBMS で、大文字小文字を識別しない、ということは、逆に言えば、vendorId、vendorName と書いてもいいのでは?


DDL で vendorId と書いても、DBMS のユーザーインタフェースを通すと VENDORID になったりするので悩ましいです。

私はアンダースコアで単語を区切るのが好みですね。

スキルアップ/キャリアアップ(JOB@IT)