我正在寻找有关多租户应用的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 :(得分:0)
如何将每一行中的总数一并排除?
然后,当你需要总数时,只需使用:
select (amount_ex_tax + tax_amount) as total_amount
. . .
您可以将其包装在视图中,因此total_amount
始终是正确的。
在一行中包含算术总计几乎没有什么优势。如果有人在插入或更新数据时准确地进行计算,则会引入问题。一行中额外空间的成本可能会抵消性能方面非常微小的节省。
进行计算的一种情况是您希望列上的索引。但是,如果您想要一个索引,那么该列应包含的内容将是显而易见的。