首先,我想开始表达我并不是想让某人为我创建我的表架构。我花了一些时间来衡量我设计中两种可能性之间的选择,我想在得到一些建议之前,然后对我当前的想法狂奔。
这是我目前的架构,我会放一个?在我考虑使用的列旁边。
键:
table_name
----------
col1 | col2 | col3
tax_zone
---------
tax_zone_id | tax_rate | description
sales_order
-----------
sales_order_id | tax_zone_id (FK) or tax_rate (?)
sales_order_item
-----------
sales_order_item_id | sales_order_id (FK) | selling_price | amount_tax or tax_rate (?)
因此,如果还不是很清楚,那么困境在于我是否应该将税务数据存储在订单的各个行中,或者使用联接来提取tax_zone信息然后在我的查询中执行某些操作(tz.tax_rate * so.order_amount) as order_total
。
目前,我正在考虑使用我刚才描述的方法。虽然我似乎无法弄清楚如何补救,但我看到这个方法存在一个问题。特定区域的税率可能会发生变化。这意味着如果某个区域的税率发生变化且我使用的是外键引用,则该费率的变化将反映在以不同费率完成的过去订单中。这会导致问题,因为目前我正在使用此表中的数据来存储已处理的订单和仍处于打开状态的订单,因此如果有人要重新打印过去的订单,则订单的总金额会改变的。
我存储特定费率或税额的问题在于,这意味着每当有人要编辑订单时,我都必须使用对这些值的更改再次更新该行。
在写这篇文章的过程中,我开始转向后一种想法,两者中的优势更好。
也许如果有人能够为我提供以下问题的答案,那么我可以自己研究一下。
这是数据库建模中的已知问题吗? 是否有关于该主题的着名“权威”出版了一本书/文章?
非常感谢任何帮助,谢谢!
答案 0 :(得分:1)
2分。您将不得不在某处存储税率,或者您无法将其添加到sales_order或其他任何地方。其次,税率可能会随着时间而变化,因此您不希望每次更新。
所以你有两个选择。
将税率存储在参考表中,并在输入表格时使用正确的税率更新每个订单。
每次访问时计算所有内容。
我个人我会去选项1但是在参考表中有一个开始时间作为主键的一部分,就像你需要更改你可能需要知道什么的税率一样订单下达时的正确率是正确的。
答案 1 :(得分:1)
在您描述的情况下,您最终必须将税率存储在订单表中,因为您需要订单关闭的费率。
因此,最清洁的解决方案必须是每次更新订单时计算税率,除非它已关闭。您可以使用触发器来执行此操作。
(当我写这篇文章时,Ben的答案突然显现 - 似乎我们不同意,这可能没有帮助: - )
答案 2 :(得分:1)
嗯,版本控制和历史记录是数据库建模中众所周知的问题。您的解决方案很常见。
对于像VAT-rates这样的简单枚举,可以使用简单的“外键tax_id引用税表(id)”。税务表永远不应该更新,一旦纳税人进入,它应该永远留在那里。如果税率在年末更改,则应在tax_table 中输入新记录,即使具有新值的记录已存在。
搜索引擎的最佳搜索词可能是“时态数据库”。