我的客户有一个动态变化的商业模式,他们销售产品 对于每日美元汇率,这意味着产品的定价每天都在变化 并且客户仍然希望保留已售产品的历史记录(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;
为什么我无法为products表创建外键?我做错了什么?
任何建议都非常感谢,
谢谢!
FYI
数据库服务器设置
- Percona MySQL 5.5.27
- 我使用timestamps和boolean flags
在db_layer中处理版本控制
更新: 我必须在orders(prod_id)列上创建一个索引,正确的模式定义 对于订单表是:
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;
答案 0 :(得分:1)
您要引用的列上需要有索引。尝试在products表中的prod_id上创建索引,然后尝试创建外键。
此外,为什么不在订单表中添加价格列,并在销售时复制当前的产品价格。这将提供您的历史记录,您无需维护产品记录的不同版本。