rails:2240
From: "Information Kanasansoft" <kanasansoft@g...>
Date: Fri, 22 Jun 2007 20:35:27 +0900
Subject: [rails:2240] 履歴を考慮した多対多のアソシエーション
kanasanです。
初めて質問します。
現在、多対多のアソシエーションを持つ
DBの設計を行っています。
結合テーブル(ブリッジテーブル)を
使用しようとしているのですが
次の問題が発生し行き詰ってしまいました。
当システムはデータウェアハウス的な
利用を想定している為、
全データに対して履歴を持たなくてはなりません。
しかし、RoRを利用しつつ
ブリッジテーブルを使用しながら
履歴を管理する方法を
見つけ出すことができませんでした。
以下、(大学の)クラブと学生を例にします。
(業務上の理由で
実例を挙げられないことをお断りします。
例は全てML投稿用に書き下ろしました。)
履歴を残さないのであれば
次のsqlとコードで十分です。
ここから========================================
ER図
club
┃[n]
┃[1]
club_student
┃[1]
┃[n]
student
----------------------------------------
SQL
create table clubs (
id int not null auto_increment,
name varchar(255) not null,
...(略)...
primary key (id)
);
create table students (
id int not null auto_increment,
name varchar(255) not null,
...(略)...
primary key (id)
);
create table clubs_students (
club_id int not null,
student_id int not null,
...(略)...
constraint fk_club
foreign key (club_id) references clubs(id),
constraint fk_student
foreign key (student_id) references students(id),
primary key (club_id, student_id)
);
----------------------------------------
RoR
class Club < ActiveRecode::Base
has_and_belongs_to_many :students
...(略)...
end
class Student < ActiveRecode::Base
has_and_belongs_to_many :clubs
...(略)...
end
ここまで========================================
上記の構造に履歴機能を持たせる為に
次のように変更しました。
・各テーブルが履歴を持てるように
全ての情報を表出しし
テーブル「〜_information」として定義
・テーブル「〜_information」と元テーブルをFKで接続
・履歴の有効期限(範囲)を管理する為に
作成日時・削除日時カラムを追加
・テーブルにあわせクラス「〜_information」を定義
・クラス「〜_information」と
元のクラスのアソシエーションの宣言を追加
ここから========================================
ER図
club_information
┃[n]
┃[1]
club
┃[n]
┃[1]
┃ [1][n]
club_student━━━club_student_information
┃[1]
┃[n]
student
┃[1]
┃[n]
student_information
----------------------------------------
SQL
create table clubs (
id int not null auto_increment,
primary key (id)
);
create table club_information (
id int not null auto_increment,
club_id int not null,
name varchar(255) not null,
...(略)...
create_at datetime null,
delete_at datetime null,
constraint fk_club_information
foreign key (club_id) references clubs(id),
primary key (id)
);
create table students (
id int not null auto_increment,
primary key (id)
);
create table student_information (
id int not null auto_increment,
student_id int not null,
name varchar(255) not null,
...(略)...
create_at datetime null,
delete_at datetime null,
constraint fk_student_information
foreign key (student_id) references students(id),
primary key (id)
);
create table clubs_students (
id int not null auto_increment,
club_id int not null,
student_id int not null,
constraint fk_club
foreign key (club_id) references clubs(id),
constraint fk_student
foreign key (student_id) references students(id),
primary key (club_id, student_id)
);
create table clubs_students_information (
id int not null auto_increment,
clubs_students_id int not null,
...(略)...
create_at datetime null,
delete_at datetime null,
constraint fk_club_student_information
foreign key (clubs_students_id) references clubs_students(id),
primary key (id)
);
----------------------------------------
RoR
class Club < ActiveRecode::Base
has_and_belongs_to_many :students
has_many :club_information
...(略)...
end
class ClubInformation < ActiveRecode::Base
belongs_to :club
...(略)...
end
class Student < ActiveRecode::Base
has_and_belongs_to_many :clubs
has_many :student_information
...(略)...
end
class StudentInformation < ActiveRecode::Base
belongs_to :student
...(略)...
end
class ClubsStudents < ActiveRecode::Base
has_many :club_student_information
...(略)...
end
class ClubsStudentsInformation < ActiveRecode::Base
belongs_to :club_student
...(略)...
end
ここまで========================================
この変更により次の問題が発生します。
・全てのデータが物理削除ではなく論理削除になるため
例外を除きSQLがinsertのみとなり
RoRでせっかく準備されているメソッドが
使えなくなる(or 使いづらくなる)
(例外は削除日時のupdateのみ)
・テーブル「clubs_students_information」の
カラム「clubs_students_id」が
RoRの単複数形の規約に則れない
・クラス「ClubsStudents」・クラス「ClubsStudentsInformation」も
RoRの単複数形の規約に則れない
等、他にも色々と問題が発生そうです。
このような場合、定石のようなモデルがあるのでしょうか。
それとも、RoRには私の知らない宣言が準備されているのでしょうか。
良いアイディアをお持ちの方や
このような状況を経験された方はいらっしゃいませんでしょうか。
宜しくお願いします。
--
ML: rails@r...
使い方: http://QuickML.com/
-> 2240 2007-06-22 13:35 [kanasansoft@g... ] 履歴を考慮した多対多のアソシエーション 2241 2007-06-22 17:27 ┗[sudo@w... ] 2244 2007-06-23 18:04 ┗[kanasansoft@g... ] 2247 2007-06-25 08:31 ┗[yamajaki@g... ] 2248 2007-06-26 03:36 ┗[kanasansoft@g... ]