mysql - 公用事业账单的数据库设计

标签 mysql database-design

<分区>

在一个系统中,我需要为电、水、回收等不同的公用事业账单保存数据,以便将来进行报告和计算。

今天,每个水电费账单都有几个不同的帖子/行。例如电费账单可以包含固定费用(账单日期范围内的金额)消费(通常电费每千瓦时,水费每立方米等)(可能是能源税)

因为我希望以后能够使用数据库来搜索不同时间段、水电费类型等的数据,所以我需要想出一个可靠的数据库设计。所以下面将是我的开始。

`utility_bill`
  `id` int(11)
  `vendor_id` int(11)
  `type_id` int(11)
  `notes` varchar(255)
  `date_issued` date
  `date_due` date

`utility_bill_rows`
  `id` int(11)
  `utility_bill_id` int(11)
  `name` varchar(64)
  `startdate` date
  `enddate` date
  `units` double
  `unit_price` double
  `unity_type` varchar(16)

数据示例:

`utility_bill`
1   2   2   Electricty bill (august)    2016-09-01  2016-09-30

`utility_bill_rows`
1   1   Fixed fee   2016-08-01  2016-08-31  31  10  days
2   1   Consumption 2016-08-01  2016-08-31  500 1   kwh
3   1   Government taxes    2016-08-01  2016-08-31  500 0.1 kwh

在上面的示例中,bill_total 将是 310 + 500 + 50 = 860

并非所有的水电费账单都是按月计算的。在某些情况下,它可能是 2016-07-01 到 2016-09-302016-08-15 到 2016-09-15 等等。因此,我正在考虑向表 utility_bill_rows 添加一个名为 daily_cost 的新列,它只是 (units * unit_price)/(enddate - startdate in days).

因此,非常感谢对上述设计和想法的任何建议。我是否应该对设计进行一些添加,以备日后使用

最佳答案

一些建议:

假设您想要汇总特定时间段内收取的所有税款。您将在查询中包含 `where name = "Government taxes"。这不是很健壮而且很笨拙。

尝试将这些类别放在一个单独的查找表中,名为,哦,billedUnits:

ID  Name        Other_info
 1  Fixed fee   ...
 2  Consumption ...
 3  Taxes       ...  -- "Government" is a duplicative redundancy

然后,使用 billedUnitID 代替 utility_bill_rows 中的字段 name 并使用查找表的 ID 值。这也使得添加“太阳能附加费”等新类别变得更加容易。

最重要的改进是在 utility_bill 表中添加一个 term 字段。这可以是单字符指示符,例如“M”代表每月,“Q”代表季度,或者是一个小整数,例如 30 和 90 代表学期的天数。这将大大简化仅涉及月度账单或季度账单的查询。我稍微倾向于整数,因为这也会简化每天的计算。

如果行的内容是稳定的,您可以添加一个 daily_cost 字段——也就是说,如果一旦写入,值就很少改变。如果调整比较频繁,不用管,需要的时候重新计算即可。

另外,请注意“成本”和“收费”的概念。在你这边,所有这些值都是费用。看到成本的是您的客户。因此,如果您创建此字段,更好的名称是 daily_charge

关于mysql - 公用事业账单的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39788692/

相关文章:

mysql - 如何在 while 中合并 select 的结果?

php - Yii2:mysql 查询以获取有关待处理作业的提醒?

sql - 将不可为空的列添加到现有表失败。 "value"属性是否被忽略?

mysql - ORDER BY 无法使用子选择正确排序的问题

php - 计算日期时正确使用 PHP 和 MySQLi 查询

mysql - 如何在两个字段上创建 'Two-Sided' 唯一索引?

mysql - 正确的数据库?需要改吗?

java - 存储查询结果的有效方法?

database-design - 多个外键

java - 当我通过 JSON 输入时,如何在 Ibatis 中将 java.util.Date 映射到 MySql Date