一个DB单元中的多个日期

时间:2015-09-15 14:59:18

标签: java mysql sql database date

我的数据库中有表格用于付款:

smb://server/folder/folder/ANC/ANC.pdf

我想让列付费日期保存类型日期,但如果客户支付了几个分期付款,那么应该保存所有这些日期。比表格应该包含与日期加上第一列相同数量的列,但是如果将有超过20个分期付款而不是20个列?我知道最简单的方法是在String中连接这些日期。 问题:还有其他方法可以在一个记录单元中保存多个日期吗?

3 个答案:

答案 0 :(得分:3)

执行此操作的最佳方法是创建另一个表来保存日期并将其链接到具有一对多关系的原始表。例如:

  

<强>表1
  ID | Client_ID |销售日期|付款总额|支付

     

<强>表2
  Table1_ID |付费日期

这允许您根据需要保存尽可能少的日期,因为它们将是一个单元格中的记录而不是单元格或连接值。

答案 1 :(得分:3)

您需要在表格中进行更多设计。您的想法的第一个问题(单个单元格上的多个日期)是您肯定会被问到每个分期付款的金额。事实上,只要这个单词“分期付款”进入问题描述,就表明你需要代表它。

幸运的是,这正是关系数据库的设计目标,以及为什么有一个名为database normalization的东西。

在这种情况下,它非常简单:应该有另一个分期表,至少包含日期和金额,以及与原始表相关的密钥,该表不应包含“日期”和“付费”字段了。

sales表:

  

ID | Client_ID |销售日期|总付款

installments表:

  

ID | Sale_ID |日期|量

获取特定销售条​​目的所有日期和金额:

SELECT Date, Amount FROM Installment WHERE Sale_ID=xxx

获得已支付的金额:

SELECT Sale.ID, Sale.Client_ID, Sale.Sale_Date, -- other 'sale' fields
    SUM(Installment.Amount)
FROM Sale
    LEFT JOIN Installment ON (Installment.Sale_ID=Sale.ID)
WHERE Sale.XXXXX   -- any criteria for selecting the sale record

获取客户欠您的资料:

SELECT SUM(Sale.Total_Payment) - SUM(Installment.Amount)
FROM Sale
    LEFT JOIN Installment ON (Installment.Sale_ID=Sale.ID)
WHERE Sale.Client_ID=xxxx

答案 2 :(得分:2)

Answer by JavierAnswer by Racil Hilan都是正确的。将多个值塞入单个字段是错误的方法,除非您绝对 100%超出 - 毫无疑问地确定这些值将仅由应用程序作为整体使用,并且从未被搜索或以其他方式访问子组件值。

命名

我会使用总付款以外的其他名称,因为此总额实际上尚未支付。也许成本。良好的命名有助于您的代码自我记录。

SQL名称提示

为了跨数据库实现最大的可移植性,并避免出现问题,请使用全部小写字母命名列,删除SPACE字符,并在单词之间使用LOW LINE(下划线)。

添加一个尾随LOW LINE (underscore)。 SQL规范明确承诺永远不会在任何标识符中使用尾随下划线。这意味着您永远不必担心您的名字与各种数据库使用的数千个保留字和关键字之间的冲突。请见我this Answer

所以client_id_date_of_sale_cost_

这是一个ERD diagram,类似于他们建议的表格设计。我正在使用Postgres data types

  • 每个客户可以拥有零个,一个或多个销售记录。
  • 每张销售记录可以有零个,一个或多个付款。
  • 每个销售记录必须只有一个指定的父母。
  • 每个付款记录必须只有一个指定的父级。

entity-relationship diagram of 3 tables, client, sale, and payment