Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 存储';借项';和';学分';保持';交易';桌子_Mysql - Fatal编程技术网

Mysql 存储';借项';和';学分';保持';交易';桌子

Mysql 存储';借项';和';学分';保持';交易';桌子,mysql,Mysql,对于事务表,哪种模式更好: customer_id type (enum, 'Debit' or 'Credit') amount (decimal, unsigned) 或 第二种解决方案似乎更简单,但我担心我遗漏了一些潜在的陷阱。第二种更简单、更有效。将来查询变得更容易,特别是余额查询。第二种解决方案更简单、更高效、更易读 当您需要进行某种聚合(求和、平均值……)时,第一种方法只会增加查询的复杂性,因为您必须将其转换为“符号” 当有更多的类别和/或类别不能仅通过值来区分时,可以使用枚举列:

对于事务表,哪种模式更好:

customer_id
type (enum, 'Debit' or 'Credit')
amount (decimal, unsigned)


第二种解决方案似乎更简单,但我担心我遗漏了一些潜在的陷阱。

第二种更简单、更有效。将来查询变得更容易,特别是余额查询。

第二种解决方案更简单、更高效、更易读

当您需要进行某种聚合(求和、平均值……)时,第一种方法只会增加查询的复杂性,因为您必须将其转换为“符号”


当有更多的类别和/或类别不能仅通过值来区分时,可以使用枚举列:DEBIT/CREDIT/TAX/…

通常最好有:

entry_id // PK
date
amount // always positive
debit_account_id // FK to accounts table
credit_account_id // FK to accounts table, not equal to debit_account_id
这样你总是有匹配的吗

一些账户是客户账户,一个是应收账款账户,等等


另请参见此项。

第二项可能更简单,但如果您的系统变得更复杂,例如需要跟踪借方和/或贷方的类型,则您可能需要一个类型字段。在传统的T账户会计中,你必须有匹配的借贷交易类型

我曾经在一个系统中这样做过,如果你愿意的话,我有一个类型。每种类型都表示右侧或左侧事务


显然是为了编写更难的代码,但这是系统的一项要求,效果很好。

我使用了一些大公司使用的会计系统。总账交易表有单独的借方和贷方列。比如:

customer_id
DebitAmount (decimal)
CreditAmount (decimal)

只有一列的值大于0,另一列始终为0。这似乎不是很有效,但它奏效了。基本上,您必须选择一个约定并使您的代码能够使用它。

背景

借项代表你拥有的东西,贷项代表别人拥有的东西。它们不是相同的尺寸单位,不应存储在同一数据库列中。使用符号位表示借项或贷项是对工作原理的过分简化;不过,这种过分简化的做法在低端和自制的会计软件包中不断出现,可能是因为这是外行对会计的看法。[1]

我发现,让软件开发人员在复式簿记中跟上进度的最简单方法是,注意会计系统中的数字不是标量,而是向量。矢量元素由一个维度轴(借方或贷方)和一个量值(有符号的固定位小数)组成。[2]

解决方案

**id    name    code    Type**
------------------------------
1       AR      100     debit
2       Cash    200     debit
3       Income  300     credit

**Transactions**
**id    date    debitAcctId creditAcctId    amount**
------------------------------------------------
1   9/16/15     1           3               100
This is a charge. We debit AR and credit Income

2   9/20/15     2           1               50
This is a payment. We debit Cash and credit AR.
您的第一个解决方案表示数据的向量性质,并遵循公认的会计惯例,但仍然将震级元素存储在同一列中,而不管它应用于哪个轴。这使得SELECT语句更加复杂

最好将借方和贷方的数量分成单独的列;这消除了对axis(enum)列的需要,简化了SQL,可能是一种性能改进,而且是更传统的方法

您的第二个解决方案(重载符号位以表示借项或贷项)每次我看到它时都会吓到我,因为我永远无法确定架构师是否在别处以某种方式补偿丢失的维度信息,或者只是不理解会计数据的向量性质。从我在上面看到的情况来看,显然有很多这样编写的会计包,但它会导致复杂、脆弱、较慢的代码和数据结构,所有这些都是为了节省一小部分数据库空间

来源

从前,我是一家国际银行的交易系统工程师。角案例不好,简单代码好

脚注

**id    name    code    Type**
------------------------------
1       AR      100     debit
2       Cash    200     debit
3       Income  300     credit

**Transactions**
**id    date    debitAcctId creditAcctId    amount**
------------------------------------------------
1   9/16/15     1           3               100
This is a charge. We debit AR and credit Income

2   9/20/15     2           1               50
This is a payment. We debit Cash and credit AR.
[1] :我认为人们之所以会误认为“负价值是借项”,部分原因在于银行业的运作方式;银行使用的语言让人们对什么是借记产生了错误的印象。从银行的角度来看,你的支票账户是别人拥有的——它有信用余额。当你把钱存入银行时,他们会告诉你他们正在“贷记”你的账户,当你取款时,他们会说“借记”。但这都是从银行的角度来看的,所以都是倒退。在你自己的会计系统中(如果你有),借记你的支票账户意味着增加余额,贷记则意味着减少。从你的角度来看,那个账户有借方余额,因为它是你自己的


[2] :如果您的语言支持固定小数位数的复数,则它们可能是处理会计数据的便捷方法;借项可能在实轴上,而贷项可能是虚构的。这创造了一些有趣的特性;一组平衡的条目将具有45度的相位角,以此类推。但是,除非您的DB引擎本机支持复数,否则您最终会将实际和复杂组件分成两列进行存储,这些列将被称为“借方”和“贷方”。

将借方存储为负数是个坏主意。在复式记账法中,借方类型账户(如应收账款)的借方是应收账款余额的增加。相反,贷记型账户的借方,如收入,是该账户余额的减少。我也使用过一个系统,其中每个交易记录都有一个借方金额字段和一个贷方金额字段。一、 我也觉得很浪费。对于我们的内部计费应用程序,我使用按id指定借方帐户和贷方帐户的交易。还有另一个表,一个科目表,存储我们所有的帐户。每个账户都有一种借记或贷记类型

若要获得特定账户的余额,如果您借记借记账户,则该金额为正,否则您将抵消该金额

-- find our AR balance from all transactions
-- debiting or crediting our AR account
SELECT
-- if our transactions debit account is AR, which is a debit-type account,
-- our amount should be positive, otherwise we make our amount negative.

IF(Transactions.debitAcctId = 1,amount,-amount) as amount
FROM
Transactions
WHERE
Transactions.debitAcctId = 1
OR
Transactions.creditAcctId = 1
我们有两张桌子: