【问题标题】:Table design issues - should I create separate fields or store as a blob表设计问题 - 我应该创建单独的字段还是存储为 blob
【发布时间】:2010-03-27 10:27:01
【问题描述】:

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

考虑到每个订单都有很多这样的情况,在以下行创建一个模式是否明智:

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

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

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

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

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

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

【问题讨论】:

    标签: sql mysql database-design


    【解决方案1】:

    将逻辑上不同的信息片段混在一起几乎总是一场灾难。减少字段数本身并不是目标。

    【讨论】:

      【解决方案2】:

      没有真正考虑过这一点,但你可以做这样的事情http://pastie.org/889605

      来自馅饼的一些 sn-ps:

      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#
      

      【讨论】:

        【解决方案3】:

        您在示例中显示的boolean 字段通常是不够的。我建议你创建其他表:

        Status (ID, Value) - essentially enumeration of possible values: Received, Acknowledged, Dispatched, ...
        OrderStatus (ID, StatusID (FK to Status), AuditBy, AuditAt, Comment)
        

        您可以完全避免使用Status 表,而只在OrderStatus 表中使用Status 列。但在这种情况下,至少将可能的值限制在您拥有的列表中。

        通过这种方式,您可以更好地跟踪发生的事情、时间和人员。

        【讨论】:

          【解决方案4】:

          很少需要将信息存储为 blob 或 xml。

          执行此操作时,您开始失去数据库引擎提供的有效查询能力。

          您的查询要么必须由应用程序处理,要么必须由专门的数据库代码处理,这似乎使事情过于复杂。

          只是考虑失去索引列的能力让我毛骨悚然 X-)

          【讨论】:

            猜你喜欢
            • 2018-05-04
            • 2014-05-06
            • 1970-01-01
            • 2010-11-29
            • 2019-03-19
            • 1970-01-01
            • 1970-01-01
            • 2015-08-05
            • 1970-01-01
            相关资源
            最近更新 更多