Я разрабатываю вторую значительную итерацию реляционной базы данных для CRM франшизы (с большим количеством рефакторинга), и мне нужна помощь в лучших методах проектирования баз данных для хранения счетов-фактур и строки счёта с сильным аудиторским следом любых изменений, внесенных в каждый счет-фактуру.
Текущая схема
Invoices
Таблица
InvoiceId (int) // Primary key
JobId (int)
StatusId (tinyint) // Pending, Paid or Deleted
UserId (int) // auditing user
Reference (nvarchar(256)) // unique natural string key with invoice number
Date (datetime)
Comments (nvarchar(MAX))
InvoiceLines
Таблица
LineId (int) // Primary key
InvoiceId (int) // related to Invoices above
Quantity (decimal(9,4))
Title (nvarchar(512))
Comment (nvarchar(512))
UnitPrice (smallmoney)
Схема пересмотра
InvoiceRevisions
Таблица
RevisionId (int) // Primary key
InvoiceId (int)
JobId (int)
StatusId (tinyint) // Pending, Paid or Deleted
UserId (int) // auditing user
Reference (nvarchar(256)) // unique natural string key with invoice number
Date (datetime)
Total (smallmoney)
Особенности проектирования схемы
1. Является ли разумным хранить счет-фактуру Платный или ожидающий статус?
Все платежи, полученные для счета-фактуры, хранятся в таблице Payments
(например, наличные, кредитная карта, чек, банковский депозит). Имеет ли смысл хранить статус "Платный" в таблице Invoices
, если весь доход, связанный с данными счета-фактуры, может быть выведен из таблицы Payments
?
2. Как отслеживать изменения позиции счета-фактуры?
Я могу отслеживать изменения в счете, сохраняя изменения состояния вместе с общей суммой счетов и аудитором в таблице таблицы изменений счетов (см. InvoiceRevisions
выше), но отслеживание таблицы пересмотра строки счета-фактуры трудно поддерживать. Мысли? Позиции Изменить: должны быть неизменными. Это относится к "проектному" счету.
3. Налог
Как мне включить налог с продаж (или 14% НДС в SA) при хранении данных счета?
Изменить: Хорошая обратная связь, ребята. Счета и счета-фактуры по определению неизменяемы, поэтому отслеживание изменений не является разумным. Однако "черновик" счета должен быть доступен для редактирования более чем одним человеком (например, менеджер применяет скидку после того, как техник создает счет-фактуру) до его выдачи...
4. Лучший способ определить и отслеживать статус счета?
- Проект
- Выпущен
- аннулирована
... ограничено изменение в одном направлении?