大家好我正在开发基于网络的订购系统,我们希望为每个订单保留一种任务历史记录。从某种意义上来说,我们想要维护一个关于谁在订单上做了什么的记录,我们就说已经输入了一个订单 - 我们想知道订单是否被确认为一个例子。或者让我们说有人跟进了订单 - 等等。
考虑到每个订单都有很多这种情况,因此在以下行中创建架构是明智的:
Orders
ID - title - description - date - is_ack - is_follow - ack_by .....
这涉及很多领域 - 另一方面,我可以有一个名为'history'的LongText字段,并用一个包含所有信息的序列化对象填充它。
然而,在后一种情况下,我无法运行查询,让我们说检索所有尚未确认的订单和类似的东西。随着时间要求的改变,我将需要对其进行修改以允许更详细的跟踪,这就是为什么我需要设置一种可以扩展的方法,但我不希望在SQL端受到限制太多了。
编辑===================
因此blob的想法有问题:(但在这方面我有什么选择。我实际上希望管理订单发生的历史。就像有人有:
答案 0 :(得分:1)
将逻辑上不同的信息混合在一起几乎总是一场灾难。减少现场数量本身并不是目标。
答案 1 :(得分:1)
并没有真正想到这一点,但你可以做这样的事情http://pastie.org/889605
来自牧场的一些片段:
drop table if exists order_events;
create table order_events(
event_id int unsigned not null auto_increment primary key,
order_id int unsigned not null,
event_type_id tinyint unsigned not null,
status_id tinyint not null,
emp_id smallint unsigned not null,
event_date datetime not null,
key order_events_order_idx(order_id),
key order_events_emp_idx(emp_id)
)engine=innodb;
drop table if exists event_type;
create table event_type(
event_type_id tinyint unsigned not null auto_increment primary key,
name varchar(255)
)engine=innodb;
insert into event_type (name) values ('new order event'),('order status event');
create trigger orders_after_upd_trig after update on orders
for each row
begin
-- change of status
if new.status_id <> old.status_id then
insert into order_events (order_id,event_type_id,status_id,event_date,emp_id)
values (old.order_id, 2, new.status_id, now(), new.updated_emp_id);
end if;
end#
答案 2 :(得分:0)
很少需要将信息存储为blob或xml。
执行此操作时,您将开始失去数据库引擎提供的有效查询功能。
然后,您的查询必须使用应用程序或专门的数据库代码处理,这似乎使事情变得复杂。
只是考虑放弃索引列的能力,我的头发X - )
答案 3 :(得分:0)
您在示例中显示的boolean
字段通常不够用。我建议你创建其他表:
Status (ID, Value) - essentially enumeration of possible values: Received, Acknowledged, Dispatched, ...
OrderStatus (ID, StatusID (FK to Status), AuditBy, AuditAt, Comment)
您可以完全避免使用Status
表,并且只需在Status
表中包含OrderStatus
列。但在这种情况下,至少将可能的值限制为您拥有的列表。
通过这种方式,您可以更好地审核发生的事情以及何时和由谁进行审核。