表设计问题 - 我应该创建单独的字段还是存储为blob

时间:2010-03-27 10:27:01

标签: sql mysql database-design

大家好我正在开发基于网络的订购系统,我们希望为每个订单保留一种任务历史记录。从某种意义上来说,我们想要维护一个关于谁在订单上做了什么的记录,我们就说已经输入了一个订单 - 我们想知道订单是否被确认为一个例子。或者让我们说有人跟进了订单 - 等等。

考虑到每个订单都有很多这种情况,因此在以下行中创建架构是明智的:

Orders
ID - title - description - date - is_ack - is_follow - ack_by .....

这涉及很多领域 - 另一方面,我可以有一个名为'history'的LongText字段,并用一个包含所有信息的序列化对象填充它。

然而,在后一种情况下,我无法运行查询,让我们说检索所有尚未确认的订单和类似的东西。随着时间要求的改变,我将需要对其进行修改以允许更详细的跟踪,这就是为什么我需要设置一种可以扩展的方法,但我不希望在SQL端受到限制太多了。

编辑===================

因此blob的想法有问题:(但在这方面我有什么选择。我实际上希望管理订单发生的历史。就像有人有:

  • 确认订单跟进
  • 订单附上电子邮件至
  • order完成订单的任务
  • 打电话等

4 个答案:

答案 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列。但在这种情况下,至少将可能的值限制为您拥有的列表。

通过这种方式,您可以更好地审核发生的事情以及何时和由谁进行审核。

相关问题