【问题标题】:how to design the tables for customer orders and bills如何为客户订单和账单设计表格
【发布时间】:2014-07-24 08:18:44
【问题描述】:

正在为酒店系统设计数据库架构(订单和账单)。 附图显示了数据库模式中的表。

问题是我如何设计 bills 表,以便我可以根据客户的订单计算客户账单?

我的假设是在下订单后计算账单,而不是反过来,例如在我们下订单之前创建账单。

我正在考虑this answer,但它并没有解决我的问题,因为我想根据客户订单计算账单。

红色矩形显示订单和账单表之间的关系,这是卡住的地方,我不知道如何设计表格。

【问题讨论】:

  • 一个账单可以链接到一个或多个订单。您将在创建第一个订单后立即创建账单。直到客户付款时,您才完成填写账单的列。如今,许多酒店系统在客户登记入住后立即计算账单,并期望支付房晚费用。客户的信用卡每天都会收取任何额外费用,直到他结帐为止。
  • @GilbertLeBlanc 假设我们说一个订单有一个账单,这意味着一个账单链接到一个订单。并引入另一个表来获取各个账单的总和。我试图避免在下订单时创建账单。我想使用一种在下订单后计算账单的方法。
  • 您在建模过程中使用了哪些资源?

标签: mysql database-design foreign-key-relationship database-normalization table-relationships


【解决方案1】:

首先进行一些语言标准化:

Order 是指销售订单,OrderDetails 称为 Line Items,Bill 通常称为 Sales Invoice。

销售发票是一种付款请求。当你认为有人欠你钱时,你会发出一个。

根据销售订单的条款,有人欠你钱:

  • 订单完成后
  • 首次提供服务后
  • 服务完成后
  • 根据销售订单条款在一段时间后

对于酒店,您通常会在服务完全交付后要求付款,但可能需要支付押金或长期住宿的中间付款。

发票不一定针对一个销售订单。您可以将多个销售订单合并为一张发票。

发票包含引用您请求付款的销售订单行项目的行项目。

您可能需要为同一个人/销售订单开具多张发票。

【讨论】:

  • 感谢您的贡献,我已经包含了一个不言自明的图表,我不太关心如何命名表格,而是销售订单(订单)和销售发票(账单)之间的关系)。我还注意到,该设计要求在我们创建销售订单之前存在账单(销售发票)。如果有人建议在销售订单完成后计算账单的任何其他 db-design,我将不胜感激。
【解决方案2】:

EDIT 3 添加了设计 + 清理

每个基表都是满足某个语句的行。找到语句。

Customer is the rows satisfying: customer [CustomerId] named [CustomerName] lives at ...
Product is the rows satisfying: product [ProductId] is named [Productname] costing [ProductPrice]
OrderDetail is the rows satisfying: orderDetail [OrderDetailId] of order [OrderId] is quantity [quantity] of product [ProductId]
Order is the rows satisfying: customer [CustomerId] ordered [OrderId] on [dateOfOrder]

您想要 Bill 中的哪些行?我猜……

Bill is the rows satisfying:
    Bill [BillId] is for order [OrderId] on [dateOfBill]  ... ???

您可以通过使用订单来了解有关账单的一些信息。您必须确定除了它的日期和顺序之外,您还想知道关于账单的其他内容(例如写一个),然后确定哪些报表账单行满足(即完成“...”)直接为您提供该信息(与其日期)或间接(与其顺序一样)。

我问

除了账单的日期和顺序之外,您还想知道什么(例如写一个)

BillId
dateOfBill
OrderId
order OrderId's customer's CustomerId, CustomerName, CustomerAddress ...
order OrderId's dateOfOrder
for every orderDetailId's orderDetail whose orderID = OrderId
    quantity, ProductId, ProductNam,e ProductPrice, (quantity * ProductPrice) as productProduct
sum(quantity * ProductPrice) as total
    over every orderDetail with OrderDetailId = OrderId

我问

哪些报表账单行满足直接或间接为您提供该信息

你建议

对于账单表,我打算有以下字段 Bill BillId (PK) CustomerId (FK) OrderId (FK) dateOfBill

Bill 必须直接给我们一个 BillId、dateOfBill 和 OrderId;他们不在其他地方。但其他一切都可以间接获得。

Bill is the rows satisfying:
    bill [BillId] is for order [OrderId] and was billed on [dateOfBill]

我提到语句的原因是:需要它们查询确定FD、键、唯一性、Fks和其他约束 . (而不是使用一种模糊的直觉。)这在设计方法 ORM2、NIAM 和 FCO-IM 中是明确的。

我通过查找其行将满足的语句来确定上面的帐单的内容:

customer [CustomerId] named [CustomerName] at [CustomerAddress] ...
owes us $[total] for order [OrderId]
ordering [quantity] of product [ProductId] named [ProductName] @ price $[ProductPrice] = [productProduct] 
as recorded in bill [BillId]

这是由为每个表给出的语句组成的语句,除了我需要一些还没有在任何表中的语句,即(因此)Bill 需要给出的东西。通过用它们的表替换语句,我们将获得其值是我们想要的行的查询。

【讨论】:

  • @phillip 我不明白你的意思,请你用表格模式或图表详细说明一下。对于账单表,我打算有以下字段 billid (Pk) customerid (Fk) orderid (fk) dateofbill
  • @glapo 1. 你不明白的第一件事是什么? 2.假设我在 Bill 中看到一行值 (f,c,o,d)。我愿意猜测那一行告诉我什么。是不是说客户 [customerId] 在 [dateOfBill] 上去了马戏团,并按照 [orderId] 的顺序处理了详细的绿色部分?不?那么好吧: 2. 告诉我这一行告诉我什么。 3. 然后告诉我当它不在比尔身上时它告诉我什么。 4. 告诉我你是如何期望有人在不知道 2 和 3 的情况下对 Bill 提出意见的。This might help.
  • 我不得不承认我花了好几天才明白你的意思,你的贡献解决了我的问题。你有我可以阅读的 Db 设计教程吗?我还建议您在 cmets 中使用简单的语法。非常感谢
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多