I’m trying to model a simple ledger in Django and would like to clear up some questions.
I would like to display the ledger as a HTML table with a column for date of entry, description, debit amount, credit amount, and balance. As with traditional ledgers, you would either have a debit amount or a credit amount (but never both) for each entry.
My questions:
1) Should I just create a column for each field in my model like an excel spreadsheet? Entering null values for the credit or debit column depending on which value is provided.
2) Or should I have a “type” field to determine whether or not the transaction is a credit or a debit?
3) How should I calculate the balance that’s shown on every single entry? Should the amount be stored somewhere after every entry or should it be calculated on the fly when the ledger is loaded?
Any help would be greatly appreciated.
Regardless if you define this as simple or not you should still adhere to standards when developing your design. I am sure many others can speak to my points with greater detail but a few things to keep in mind in regards to your questions.
1) If you want to maintain a spreadsheet then get rid of the database altogether. I am sure that is not what you are after. So don’t create fields for credit and debit and allow a swisscheese pattern of nulls. If you are building a database you can easily avoid this. All transactions (debit/credit) should be handled in one column of Amount. Yes this will have a (-) sign in the database. Don’t model the data in your database to a “pretty” format that you customer wants to see. Let standards dictate how data is stored and worry about the presentation (delivering that “pretty”) in a different respect.
2) You can create a type field but leave it as boolean if anything
3) I am still working through a solution here myself. Deriving this value on the fly in a relatively small or inactive database is not a problem. I am not sure about the scalability though. I have heard differing OPINIONS as to this so I will hold my breath here until I see a scalable solution that properly handles the load.