2007年09月11日

今日の技術メモで思ったこと

今日の技術メモでは、Ruby on RailsでPKが複合キーの場合の対処を書きましたが、基本的にはRuby on Rails本体は複合キーはサポート外なので、もし受託開発であれば当対処は適用するのは難しいですよね。

複合キーというのは、業務システムでは珍しいことではないと思うのですが、サポート外というのはどういうことなのでしょう。

例えば、受発注システムでのお約束のDBテーブルとして、「伝票テーブル」と「伝票明細テーブル」というのがあると思います。

この2つのテーブルは親子関係であり、
「伝票テーブル」のPKは「伝票番号」
「伝票明細テーブル」のPKは複合キーで「伝票番号、明細番号」
リレーションキーは「伝票番号」
というのがありがちなものと思います(さらにいうと「伝票番号」は単純な通番ではなく、伝票の種別的な情報を埋め込む場合もあると思います)。

Ruby on Railsの考え方では、多分ですが、業務的に意味ある列(「伝票番号」「明細番号」)をPKにせず、Rails用の「id」列を設けてPKとするDB設計を想定しているのでしょう。

しかし、ある程度の規模になれば、伝票系のテーブルのレコード数は数百万件レベル以上になると思われ、そうなると、1つの列の追加(この場合、「伝票番号」「明細番号」にインデックスをはることになるので、その分も含めて)はストレージの設計にも影響が出ると思われます。

極端に言えば、Ruby on Railsを使うためのディスク容量は、Ruby on Railsを使わない場合と比較して、増量する可能性もあり、当然設備投資費用も増えます。

速度的な問題だけでなく、この辺についてもRuby on Railsは小規模システムの開発向けなのだろうなあと思いました。

まあ、第二印象といったところですが猫


posted by 台北猫々 at 23:33| Comment(0) | TrackBack(1) | 日記

Ruby on RailsをEclipseでいこう その8 〜PKが複合キーだよの巻〜

今日は、PKが複合キーの場合です。

Ruby on Railsは複合キーをサポートしないため、Composite Primary Keys
にあるように以下のコマンドをDOSコマンドプロンプトから実行して、拡張モジュールをインストールします。

>gem install composite_primary_keys

インストールができたら、Railsプロジェクトの
/config/environment.rbの末尾に以下の文を追加します。
require 'composite_primary_keys'

次に以下のDBテーブルを作成しましょう。
CREATE TABLE bookmark (
bookmark_id INTEGER(11) NOT NULL,
branch_no INTEGER(10) UNSIGNED NOT NULL,
url VARCHAR(255) NOT NULL,
PRIMARY KEY(bookmark_id, branch_no)
);

そして、EclipseのRadRailsのジェネレータタブからscaffoldを以下のように実行しましょう。
(ActiveRecord::Base.pluralize_table_names = falseの設定が前提です。)

scaffold Bookmark Bookmark

できあがった/models/bookmark.rbを以下のように改造します。

(変更前)
class Bookmark < ActiveRecord::Base
end

(変更後)
class Bookmark < ActiveRecord::Base
set_primary_keys :bookmark_id, :branch_no

#"branch_no"は"1"固定にしています。とりあえずね。
def before_create
self.id = [ self.bookmark_id_next, 1 ]
end

def bookmark_id_next
return ActiveRecord::Base.connection.select_value('select ifnull(max(bookmark_id),0)+1 from bookmark')
end
end


いつものようにWEBrickで確認しましょう(http://localhost:3000/bookmark)←実際は全部半角小文字

ただし、登録フォームに"branch_no"がありますが、/models/bookmark.rbで"1"固定にしているので、画面からの入力値は無視されます。


posted by 台北猫々 at 19:25| Comment(0) | TrackBack(0) | 技術メモ(Ruby)