数据建模草稿/报价/订单/发票

| 我目前正在从事一个小型项目,在该项目中,我需要为以下场景建模: 情境 客户打电话给他,他想要一辆新车的报价。 销售代表。注册客户信息。 销售代表。在系统中创建报价,然后在报价(汽车)中添加项目。 销售代表。通过电子邮件将报价发送给客户。 客户接受报价,现在报价不再是报价,而是订单。 销售代表。检查订单,一切都很好,他给订单开了发票。现在,该订单不再是订单,而是发票。 思想 我需要一些帮助来找出建模的理想方法,但是我有一些想法。 我认为草稿/报价单/发票基本上都是订单。 草稿/报价单/发票需要单独的唯一编号(id \'s),因此我正在考虑为所有这些单独的表格。 模型 这是我的数据模型v.1.0,请告诉我您的想法。 顾虑 但是我对此模型有一些担忧: 订单行上的草稿/报价/发票可能具有不同的项目和价格。在此模型中,所有的草稿/报价单/发票都连接到相同的订单以及订单行,因此不可能有单独的报价单/草稿线/发票线。也许我会为此创建新表,但是基本上相同的信息会存储在多个表中,这也不是一件好事。 有时两个或两个以上的报价成为发票,此模型将如何处理? 如果您对如何更好地建模有任何建议,请告诉我! 编辑:数据模型v.1.4     
已邀请:
看来您已经将所有这些事物(报价,订单,草稿,发票)建模为与所有其他事物在结构上相同。如果是这种情况,则可以将所有类似的属性“推”到单个表中。
create table statement (
    stmt_id integer primary key,
    stmt_type char(1) not null check (stmt_type in (\'d\', \'q\', \'o\', \'i\')),
    stmt_date date not null default current_date,
    customer_id integer not null  -- references customer (customer_id)
);

create table statement_line_items (
    stmt_id integer not null references statement (stmt_id),
    line_item_number integer not null,
    -- other columns for line items
    primary key (stmt_id, line_item_number)
);
我认为这将适用于您描述的模型,但从长远来看,通过将它们建模为超类型/子类型,可以为您提供更好的服务。所有子类型共有的列都被“向上”推入父类型。每个子类型都有一个单独的表,用于表示该子类型唯一的属性。 这样的SO问题及其接受的答案(和评论)说明了博客评论的超类型/子类型设计。另一个问题涉及个人和组织。另一个与人员配备和电话号码有关。 以后。 。 。 这还没有完成,但是我没时间了。我知道它不包含订单项。可能错过了其他东西。
-- \"Supertype\". Comments appear above the column they apply to.
create table statement (
  -- Autoincrement or serial is ok here.
  stmt_id integer primary key,    
  stmt_type char(1) unique check (stmt_type in (\'d\',\'q\',\'o\',\'i\')),
  -- Guarantees that only the order_st table can reference rows having
  -- stmt_type = \'o\', only the invoice_st table can reference rows having
  -- stmt_type = \'i\', etc.
  unique (stmt_id, stmt_type),
  stmt_date date not null default current_date,
  cust_id integer not null -- references customers (cust_id)
);

-- order \"subtype\"
create table order_st (
  stmt_id integer primary key,
  stmt_type char(1) not null default \'o\' check (stmt_type = \'o\'),
  -- Guarantees that this row references a row having stmt_type = \'o\'
  -- in the table \"statement\".
  unique (stmt_id, stmt_type),
  -- Don\'t cascade deletes. Don\'t even allow deletes. Every order given
  -- an order number must be maintained for accountability, if not for
  -- accounting. 
  foreign key (stmt_id, stmt_type) references statement (stmt_id, stmt_type) 
    on delete restrict,
  -- Autoincrement or serial is *not* ok here, because they can have gaps. 
  -- Database must account for each order number.
  order_num integer not null,  
  is_canceled boolean not null 
    default FALSE
);

-- Write triggers, rules, whatever to make this view updatable.
-- You build one view per subtype, joining the supertype and the subtype.
-- Application code uses the updatable views, not the base tables.    
create view orders as 
select t1.stmt_id, t1.stmt_type, t1.stmt_date, t1.cust_id,
       t2.order_num, t2.is_canceled
from statement t1
inner join order_st t2 on (t1.stmt_id = t2.stmt_id);
    
应该有一个表“ quotelines \”,它类似于“ orderlines \”。同样,您应该有一个\'invoicelines \'表。所有这些表都应有一个“价格”字段(名义上将是零件的默认价格)以及一个“折扣”字段。您还可以在\ quotes \',\'orders \'和\'invoices \'表中添加\'discount \'字段,以处理诸如现金折扣或特价优惠之类的事情。尽管您编写了什么,但还是要有单独的表格,因为报价中的金额和价格可能与客户实际订购的金额不匹配,并且再次与您实际提供的金额可能不同。 我不确定\'draft \'表是什么-您可能会合并\'draft \'和\'invoices \'表,因为它们具有相同的信息,而其中一个字段包含发票的状态-草稿或最终稿。将发票数据与订单数据分开很重要,因为大概您将根据自己的收入(发票)纳税。 \'Quotes \',\'Orders \'和\'Invoices \'应该都具有一个字段(外键),用于保存销售代表的价值;该字段将指向不存在的\'SalesRep \'表。您也可以在\'customers \'表中添加一个\'salesrep \'字段,该字段指向客户的默认代表。该值将被复制到\'quotes \'表中,尽管如果默认值的不同代表给出了引用,则可以更改该值。同样,当从报价单中订购订单时,应复制该字段。 我可能会添加更多,但这全取决于您要制作的系统的复杂程度和详细程度。如果汽车是根据其选项配置并相应定价的,则可能需要添加某种形式的“材料清单”。     

要回复问题请先登录注册