Разработка БД для коммунальных платежей
В системе мне нужно сохранять данные для счетов за коммунальные услуги, электричество, воду, переработку, чтобы составлять отчеты и расчеты в будущем.
Сегодня каждый счет за коммунальные услуги состоит из нескольких разных постов / строк. Например electricity
счет может включать fixed fee
(сумма для диапазона дат счета) consumption
(обычно выставляется счет за кВтч электроэнергии, м3 воды и т. д.) taxes
(могут быть налоги на энергию)
Поскольку я хочу иметь возможность использовать базу данных позже для поиска данных за различные периоды времени, типы счетов за коммунальные услуги и т. Д., Мне нужно придумать надежный дизайн БД. Так что ниже будет моим началом.
`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 to 2016-09-30
, 2016-08-15 to 2016-09-15
и так далее. Поэтому я думал о добавлении нового столбца в таблицу utility_bill_rows
называется daily_cost
который был бы просто (units * unit_price) / (enddate - startdate in days)
,
Таким образом, любые предложения к вышеупомянутому дизайну и мыслям очень ценятся. Должен ли я сделать некоторые дополнения к дизайну, которые могут быть полезны позже, когда
1 ответ
Некоторые предложения:
Предположим, вы хотите суммировать все налоги, взимаемые за определенное время. В запросе у вас будет `where name = " Правительственные налоги ". Это не очень надежно и просто неудобно.
Попробуйте поместить эти категории в отдельную таблицу поиска с именем, о, billedUnits
:
ID Name Other_info
1 Fixed fee ...
2 Consumption ...
3 Taxes ... -- "Government" is a duplicative redundancy
Тогда вместо поля name
в utility_bill_rows
использовать billedUnitID
и используйте значение идентификатора таблицы поиска. Это также облегчает добавление новых категорий, таких как "Солнечная надбавка".
Наиболее значительным улучшением будет добавление term
поле в utility_bill
Таблица. Это может быть односимвольное обозначение, например, "M" для месячных и "Q" для ежеквартальных, или маленькое целое число, например, 30 и 90 для дней срока. Это значительно упростит запросы, которые касаются только ежемесячных счетов или только квартальных счетов. Я немного склоняюсь к целому числу, поскольку это также упростит расчет за день.
Вы можете добавить daily_cost
поле, если содержимое строки является стабильным - то есть, если однажды записаны значения редко, если вообще изменяются. Если есть относительно частые корректировки, не беспокойтесь, просто пересчитайте при необходимости.
Также следует помнить о понятиях "стоимость" и "плата". В конце концов, все эти значения являются платными. Это ваш клиент, который видит расходы. Так что, если вы создадите это поле, лучшее имя будет daily_charge
,