Bagaimana melakukan pembuatan versi baris di MySQL dengan tetap menjaga integritas referensial kunci asing

Klien saya memiliki model bisnis yang berubah secara dinamis, mereka menjual produk sesuai dengan nilai tukar USD harian, ini berarti harga produk berubah setiap hari dan klien tetap ingin menyimpan riwayat (harga, tanggal_terjual) produk yang terjual (info ini disimpan di tabel pesanan).

Satu-satunya cara yang dapat saya pikirkan untuk menerapkan solusi untuk klien saya adalah dengan menggunakan versi baris. (Mereka menggunakan MySQL sebagai server database)

Ini adalah skema saat ini (seperti prototipe) yang ingin saya terapkan dengan tetap menjaga integritas referensial, namun ketika saya membuat tabel pesanan saya mendapatkan kesalahan sebagai berikut:

ERROR 1005 (HY000): Can't create table 'mydb.orders' (errno: 150)

Berikut desain skemanya:

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;

Mengapa saya tidak dapat membuat kunci asing ke tabel produk? Apa yang saya lakukan salah?

Setiap saran sangat dihargai,

Terima kasih!

Untuk diketahui

Pengaturan Server Basis Data

  • Percona MySQL 5.5.27
  • Saya menangani pembuatan versi di db_layer saya dengan menggunakan stempel waktu dan flag boolean

UPDATE : Saya harus membuat indeks pada kolom pesanan(prod_id), definisi skema yang benar untuk tabel pesanan adalah :

 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;

person Chesneycar    schedule 21.09.2012    source sumber
comment
Perhatikan bahwa Anda menyimpan salinan semua info produk lainnya (nama, dll), hanya untuk mendapatkan salinan harganya. Pisahkan harga ke tabel lain (dengan tanggal), atau gunakan pemicu untuk menulis harga lama ke tabel historis ketika seseorang memperbarui harga produk.   -  person Alain Collins    schedule 21.09.2012


Jawaban (1)


Harus ada indeks pada kolom yang Anda referensikan. Coba buat indeks pada prod_id di tabel produk, lalu coba buat kunci asing Anda.

Selain itu, mengapa tidak menambahkan kolom harga saja ke tabel pesanan dan menyalin harga produk saat ini di sana pada saat penjualan. Itu akan memberikan riwayat Anda dan Anda tidak perlu menyimpan versi catatan produk yang berbeda.

person bobwienholt    schedule 21.09.2012
comment
Terima kasih atas sarannya, izinkan saya mencoba melakukannya. - person Chesneycar; 21.09.2012
comment
Ini bekerja! Terima kasih atas jawaban anda. Saya memperbarui pertanyaan untuk menunjukkan definisi skema tabel yang benar dari tabel pesanan. - person Chesneycar; 21.09.2012
comment
Saya setuju bahwa lebih mudah untuk menyalin harga saat ini, namun saya tidak yakin apakah itu berfungsi dengan baik untuk audit, karena Anda (@Bosvark) kehilangan riwayat perubahan harga yang sebenarnya. Dan seperti yang disebutkan Alain, Anda hanya dapat menyimpan versi harga saja, bukan seluruh informasi produk. (IANAL/F/A - bukan pengacara/keuangan/akuntan) - person aneroid; 05.10.2012