Use*_*841 10 mysql database-design
我正在研究一个会计系统,对于每笔交易,如果这是借方或贷方,我需要保存。我可以想到两种方法(MySQL数据库):
方法一
方法二
在第一个设置中,我保存了交易类型,但在第二种方式中,我宁愿将金额保存在借方或贷方列中。这种方法的优点是与方法 1 相比,我可以更轻松地将借方和贷方总额相加。但我想知道是否有一种通用的方法可以做到这一点?
另一种方法(不知道这是否常见!):
create table `transactions` (
... some columns ...
amount decimal(10,2),
ttype int,
foreign key (ttype) references transactiontypes (id)
...
);
create table transactiontypes (
id int primary key,
description varchar(30),
multiplier int
);
Run Code Online (Sandbox Code Playgroud)
然后在transactiontypes
你有:
select * from transactiontypes;
+----+---------------+------------+
| id | description | multiplier |
+----+---------------+------------+
| 1 | deposit | 1 |
| 2 | withdrawal | -1 |
+----+---------------+------------+
Run Code Online (Sandbox Code Playgroud)
可能还有更多行。
然后所有金额都transactions
将是正数,并加入transactiontypes
+ 乘法multiplier
得到“真实”(正/负)金额。
小智 7
你的方法1是正确的。这是我在会计系统中的实施方式。该模型来自“The Data Model Resource Book”。您存储数据的方式与会计术语对复式记账法建模的方式大不相同。信用可能意味着正面或负面,具体取决于您是在资产账户还是负债账户上工作。无论您发布到什么类型的帐户,此架构都允许您保留数据。
+----+-----------------------+------------+
| PK | TransactionID | int |
+----+-----------------------+------------+
| | Description | varchar |
| | Date | datetime |
+----+---------------+--------------------+
+----+-----------------------+------------+
| PK | TransactionID | int |
| PK | TransactionSequenceID | smallint |
+----+-----------------------+------------+
| | Amount | decimal |
| | CreditDebitFlag | char(1) |
+----+---------------+--------------------+
Run Code Online (Sandbox Code Playgroud)