0

私のクライアントは動的に変化するビジネスモデルを持っており、毎日の米ドルの為替レートに従って製品を販売しています。つまり、製品の価格は毎日変化し、クライアントは販売された製品の履歴(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;
4

1 に答える 1

1

参照している列にインデックスが必要です。productsテーブルのprod_idにインデックスを作成してから、外部キーを作成してみてください。

また、注文テーブルに価格列を追加して、販売時の現在の製品価格をコピーしてみませんか。それはあなたの歴史を提供し、あなたは製品記録の異なるバージョンを維持する必要はありません。

于 2012-09-21T14:47:59.923 に答える