Database 使用字段还是整个新表?

Database 使用字段还是整个新表?,database,database-design,invoice,Database,Database Design,Invoice,在选择以下两种数据库布局时,我确实需要一些见解 Layout #1 | Layout #2 | CUSTOMERS | CUSTOMERS id int pk | id int pk info char | info char | ORDERS | ORDERS id int pk

在选择以下两种数据库布局时,我确实需要一些见解

Layout #1          | Layout #2  
                   |  
CUSTOMERS          | CUSTOMERS  
 id int pk         |  id int pk  
 info char         |  info char  
                   |  
ORDERS             | ORDERS  
 id int pk         |  id int pk  
 customerid int fk |  customerid int fk  
 date timedate     |  date timedate  
                   |  
DETAILS            | INVOICES  
 id int pk         |  id int pk  
 orderid int fk    |  orderid int fk  
 date timedate     |  date timedate  
 description char  |  
 amount real       | DETAILS  
 period int        |  id int pk  
                   |  invoiceid int fk  
                   |  date timedate  
                   |  description char  
                   |  amount real  
这是一个小型企业的账单应用程序,一个独资企业。第一个布局没有单独的发票表,而是依赖于账单周期号的详细字段“期间”。第二种布局引入了一个专门用于发票的表

特别是在这个应用程序中,您看到布局1在什么时候中断,或者随着数据量的增加,什么样的事情会变得越来越困难?在布局2的情况下,增加的灵活性/复杂性在实践中意味着什么?30-60-90岁年龄段的影响是什么?我相信这在某个时候是必要的


更一般地说,这似乎是通过表中的字段或整个新表跟踪/控制某些内容的一般情况,但这并不是真正的规范化问题,不是吗?您通常是如何选择的?

我不完全确定为什么将句号附加到项目而不是订单本身。布局1似乎意味着您可以拥有一个开放式订单,该订单由可能添加的细节组成,并在几年内支付。这似乎是非常错误的,应该让会计成为一场噩梦。布局2其实并没有好多少

一般来说,订单由具有购买日期或合同日期的单笔交易组成。该事务可能包含多个细节项,但它仍然是一个事务。它代表买方和卖方在某一时间点达成的单一协议。如果购买了新项目,将创建新订单。。。考虑到这一点,两种表结构都不起作用

关于发票。订单可能附有一张或多张发票。发票的目标是对其进行付款。对于小额交易,发票和订单之间存在一对一的关系

在较大的交易中,您可能有多个发票应用于单个订单。例如,如果您已签订合同,支付3笔金额为199.99美元的简易付款。在这种情况下,您将有3张发票,每张199.99美元,用于一个订单,其总额为599.97美元;每一次都在不同的时间段到期

发票表应至少包含订单Id、发票编号、发票日期、发票金额、到期日期、信用卡交易Id、支票编号、收到金额和收到日期字段

如果您想获得更多的想象力并支持现实世界,那么您还需要一个付款表,其中存储发票号、收到或退款金额、收到日期、交易ID和支票号。如果执行此操作,请从发票表中删除这些字段


现在,如果您需要支持经常性费用,例如,internet托管,那么您将有一个名为Contracts和ContractDetails的不同表或类似的表。这些表将存储与订单和订单详细信息类似的合同详细信息,但包括开始日期、结束日期和重复周期。当到达下一个计费周期时,详细信息将用于创建订单并生成相应的发票。

我不完全确定为什么周期会附加到项目而不是订单本身。布局1似乎意味着您可以拥有一个开放式订单,该订单由可能添加的细节组成,并在几年内支付。这似乎是非常错误的,应该让会计成为一场噩梦。布局2其实并没有好多少

一般来说,订单由具有购买日期或合同日期的单笔交易组成。该事务可能包含多个细节项,但它仍然是一个事务。它代表买方和卖方在某一时间点达成的单一协议。如果购买了新项目,将创建新订单。。。考虑到这一点,两种表结构都不起作用

关于发票。订单可能附有一张或多张发票。发票的目标是对其进行付款。对于小额交易,发票和订单之间存在一对一的关系

在较大的交易中,您可能有多个发票应用于单个订单。例如,如果您已签订合同,支付3笔金额为199.99美元的简易付款。在这种情况下,您将有3张发票,每张199.99美元,用于一个订单,其总额为599.97美元;每一次都在不同的时间段到期

发票表应至少包含订单Id、发票编号、发票日期、发票金额、到期日期、信用卡交易Id、支票编号、收到金额和收到日期字段

如果您想获得更多的想象力并支持现实世界,那么您还需要一个付款表,其中存储发票号、收到或退款金额、收到日期、交易ID和支票号。如果你走这条路 oute,从发票表中删除这些字段


现在,如果您需要支持经常性费用,例如,internet托管,那么您将有一个名为Contracts和ContractDetails的不同表或类似的表。这些表将存储与订单和订单详细信息类似的合同详细信息,但包括开始日期、结束日期和重复周期。当到达下一个计费周期时,详细信息将用于创建订单并生成相应的发票。

鉴于前面的评论,我将这样处理:

CUSTOMERS
  id int pk
  info char

CASES
  id int pk
  customerid int fk
  dateOpened datetime
  dateClosed datetime
  status int <- open, closed, final billed, etc.
  BillPeriod int <- here is where you determine how often to bill the client.
  BillStartDate datetime <- date that billings should start on.

BILLING
  billingid int pk
  caseid int fk
  userid int fk <- id of person who is charging to this case. i.e. the lawyer.
  invoicedetailid fk <- nullable, this will make it easier to determine if this particular item has been invoiced or not.
  amount money
  billdate datetime
  billingcode int fk <- associate with some type of billing code table so you know what this is: time, materials, etc.
  description char


INVOICES
  invoiceid int pk
  customerid int FK
  invoicedate datetime
  amount money <- sum of all invoice details
  status int <- paid, unpaid, collection, etc..
  discount money <- sum of all invoice details discounts
  invoicetotal <- usually amount - discount.

INVOICEDETAILS
  invoicedetailid int PK
  invoiceid int FK
  billingid int FK
  discount money <- amount of a discount, if any
===========

在上面的示例中,您打开一个案例并将其与客户关联。在持续的基础上,一个或多个人员将账单应用于该案件

一旦账单开始日期和期间的组合已过,系统将创建一个新发票,其中包含从账单表复制的详细信息。它应该根据那些尚未计费的细节来完成这项工作。一旦开票,您应该锁定账单记录,防止将来发生更改

如果需要不同的触发器,可能必须将BillPeriod更改为其他类型的字段。例如,期间只是创建发票的一个触发器


其中一个可能包括当你达到一定金额时发送发票。这可以在客户或案例级别进行配置。另一个选择是限制支出。例如,在案例级别设置上限值,以防止账单超出上限;或者至少导致向相关方发送警报。

鉴于前面的评论,我将这样做:

CUSTOMERS
  id int pk
  info char

CASES
  id int pk
  customerid int fk
  dateOpened datetime
  dateClosed datetime
  status int <- open, closed, final billed, etc.
  BillPeriod int <- here is where you determine how often to bill the client.
  BillStartDate datetime <- date that billings should start on.

BILLING
  billingid int pk
  caseid int fk
  userid int fk <- id of person who is charging to this case. i.e. the lawyer.
  invoicedetailid fk <- nullable, this will make it easier to determine if this particular item has been invoiced or not.
  amount money
  billdate datetime
  billingcode int fk <- associate with some type of billing code table so you know what this is: time, materials, etc.
  description char


INVOICES
  invoiceid int pk
  customerid int FK
  invoicedate datetime
  amount money <- sum of all invoice details
  status int <- paid, unpaid, collection, etc..
  discount money <- sum of all invoice details discounts
  invoicetotal <- usually amount - discount.

INVOICEDETAILS
  invoicedetailid int PK
  invoiceid int FK
  billingid int FK
  discount money <- amount of a discount, if any
===========

在上面的示例中,您打开一个案例并将其与客户关联。在持续的基础上,一个或多个人员将账单应用于该案件

一旦账单开始日期和期间的组合已过,系统将创建一个新发票,其中包含从账单表复制的详细信息。它应该根据那些尚未计费的细节来完成这项工作。一旦开票,您应该锁定账单记录,防止将来发生更改

如果需要不同的触发器,可能必须将BillPeriod更改为其他类型的字段。例如,期间只是创建发票的一个触发器


其中一个可能包括当你达到一定金额时发送发票。这可以在客户或案例级别进行配置。另一个选择是限制支出。例如,在案例级别设置上限值,以防止账单超出上限;或者至少会导致向相关方发送警报。

既然您正在进行合法的计费,我建议您花一些时间查看的功能。律师的行为不像其他人;立法者的会计软件与其他会计软件不一样。这是生意的本质

他们有30天的免费试用期,您可能可以从帮助文件和文档中学到很多东西


此外,从用户界面进行反向工程数据库设计是一种很好的做法。

既然您正在进行合法的计费,我建议您花一些时间来了解。律师的行为不像其他人;立法者的会计软件与其他会计软件不一样。这是生意的本质

他们有30天的免费试用期,您可能可以从帮助文件和文档中学到很多东西


此外,从用户界面进行逆向工程数据库设计是一种很好的做法。

谢谢,我会消化你的答案,但让我澄清一下,这不是一次交易中同时购买六件商品的零售类型。我试图让这个例子变得通用,但这是法律账单,订单实际上是法律案例,可能会拖上几年。尽管如此,时间和费用通常按月计费,即使案件尚未结束。发票仅适用于当前活动,可通过使用期间字段或将明细行直接关联到发票记录来提取。PS我认为对于酒店应用程序也是如此,在酒店应用程序中,客人登记入住并随时间累积费用。超过信用额度的客人会被要求支付余额,但该账户是一个从入住到退房的收费和付款的长长的年表。非常有趣的回答,这非常有帮助!只是一个简单的问题,发票表中的发票金额是多少?这是订单表中订单成本的总和吗?如果不是这样,那么订单的总成本不应该存储在发票表中吗?发票表中是否还应包含状态字段?如到期、已付、未付、取消?@user622378:发票金额可能是订单表中的总计,也可能只是其中的一部分。这是为了支持单个订单的多个发票。是的,发票表应该有一个状态字段。谢谢,我会消化你的答案,但是我
让我澄清一下,这不是一种零售类型的情况,即在一次交易中同时购买六件商品。我试图让这个例子变得通用,但这是法律账单,订单实际上是法律案例,可能会拖上几年。尽管如此,时间和费用通常按月计费,即使案件尚未结束。发票仅适用于当前活动,可通过使用期间字段或将明细行直接关联到发票记录来提取。PS我认为对于酒店应用程序也是如此,在酒店应用程序中,客人登记入住并随时间累积费用。超过信用额度的客人会被要求支付余额,但该账户是一个从入住到退房的收费和付款的长长的年表。非常有趣的回答,这非常有帮助!只是一个简单的问题,发票表中的发票金额是多少?这是订单表中订单成本的总和吗?如果不是这样,那么订单的总成本不应该存储在发票表中吗?发票表中是否还应包含状态字段?如到期、已付、未付、取消?@user622378:发票金额可能是订单表中的总计,也可能只是其中的一部分。这是为了支持单个订单的多个发票。是的,invoice表应该有一个status字段。我认为您最好为您的客户服务,建议他们购买一份Quickbooks,而不是为他们编写数据库应用程序。@Catcall谢谢,但这只是一个实践应用程序。没有客户。我读过你的一些帖子,你似乎知道你的东西。如果您不介意的话,我将非常感谢您对编程问题的想法我认为你最好为你的客户服务,建议他们购买一份Quickbooks,而不是为他们编写一个数据库应用程序。@Catcall谢谢,但这只是一个实践应用程序。没有客户。我读过你的一些帖子,你似乎知道你的东西。如果您不介意的话,我将非常感谢您对编程问题的想法谢谢你,克里斯,我为你的迟到道歉。回答得好!谢谢你,克里斯,我为你的迟到道歉。回答得好!