2016-05-15 76 views
-1

我正在寻找invoices/invoice_details表的一个多租户应用程序的建议,其中一些租户将注册税务,一些不会。关于进销存表和税收处理的最佳做法建议

invoice_details表包含以下字段:

id description amount_ex_tax tax_amount amount_inc_tax 

租客税收启用,详细信息行可能包含:

id description amount_ex_tax tax_amount amount_inc_tax 
1234 Repairs    100.00  20.00   120.00 

租客税收禁用,详细行可能包含:

id description amount_ex_tax tax_amount amount_inc_tax 
1234 Repairs    100.00  0.00   0.00 

然后,这会产生没有一列的问题,以便找出发票值。

选项1:保持原样,但查询将不得不根据租户类型进行调整以询问正确的列。这使得各种SQL查询更加复杂。

选项2:我读过的建议说要设置amount_inc_tax = amount_ex_tax,那么查询总是将相同的列相加以得到发票的价值。这简化了SQL。它应该是这样的:

id description amount_ex_tax tax_amount amount_inc_tax 
1234 Repairs    100.00  0.00   100.00 

我觉得这个建议混淆了代码本身,作为列名不包含什么是推断。方案3:另一个建议是创建一个total column,这样总是可以访问总价值的列,而不管是否纳税或不纳税。

它应该是这样的:

id description amount_ex_tax tax_amount amount_inc_tax total_amount 
1234 Repairs    100.00  0.00   0.00  100.00 

是什么,在这种情况下都工作最适合你的最佳/做法/建议吗?哪种方式可以避免将来出现哪些问题?感谢您的任何建议!

回答

0

如何将每行中的总数排除在外?

然后,当你想总,只需使用:

select (amount_ex_tax + tax_amount) as total_amount 
. . . 

您可以在视图中把这个包,所以total_amount是总是正确的。

在单行内包含算术总和几乎没有优势。如果有人在插入或更新数据时准确地进行计算,它会引入问题。行内额外空间的成本可能会抵消性能方面非常小的节省。

您需要计算的一种情况是当您需要列上的索引时。但是,如果你想要一个索引,那么这个列应该包含什么是显而易见的。

+0

真棒建议@戈登Linoff,有道理,并没有看到/想到这一点。感谢upvote。 – TheRealPapa

+0

最新的MySQL版本支持也可以被索引的虚拟列。 –

+0

@PaulSpiegel和任何有兴趣的人。 。 。支持在5.7。6,并记录在http://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html。 –

相关问题