私のクライアントは動的に変化するビジネスモデルを持っており、毎日の米ドルの為替レートに従って製品を販売しています。つまり、製品の価格は毎日変化し、クライアントは販売された製品の履歴(price、date_sold)を保持したいと考えています。 (この情報は注文テーブルに保存されます)。
クライアントにソリューションを実装することを考える唯一の方法は、行のバージョン管理を使用することです。(彼らはデータベースサーバーとしてMySQLを使用しています)
これは、参照整合性を維持しながら実装したい現在のスキーマ(プロトタイプと同じ)ですが、ordersテーブルを作成すると、次のようなエラーが発生します。
ERROR 1005 (HY000): Can't create table 'mydb.orders' (errno: 150)
これでスキーマ設計:
create table products (
id int not null auto_increment,
prod_id int not null,
name varchar(200) NOT NULL,
price decimal(8,2) NOT NULL default 0,
is_active boolean default 0,
deleted boolean default 0,
create_date timestamp NOT NULL default current_timestamp,
end_date timestamp NOT NULL default '2030-01-01 00:00:00',
primary key(id)
)engine=innodb;
create table orders (
id int not null auto_increment,
prod_id int not null,
foreign key(prod_id) references products(prod_id),
date_sold timestamp NOT NULL default current_timestamp,
primary key(id)
)engine=innodb;
製品テーブルへの外部キーを作成できないのはなぜですか?私は何が間違っているのですか?
どんなアドバイスも大歓迎です、
ありがとう!
ご参考までに
データベースサーバーのセットアップ
- Percona MySQL 5.5.27
- タイムスタンプとブールフラグを使用して、db_layerでバージョン管理を処理します
更新: orders(prod_id)列にインデックスを作成する必要がありました。ordersテーブルの正しいスキーマ定義は次のとおりです。
create table orders (
id int not null auto_increment,
prod_id int not null,
index product_id(prod_id),
foreign key(prod_id) references products(prod_id),
date_sold timestamp NOT NULL default current_timestamp,
primary key(id)
)engine=innodb;