2011-12-17 133 views
0

让我们想象一下: 有一个网站,一种工作板。产品在那里虚拟。发布条目有额外的选项和费用。数据库:存储税率和信息

现在,在我们国家,有增值税,真的很复杂的规则。企业位于PL:
- 用户PL - 增值税税率为23%
- 欧盟个人用户 - 增值税税率为23%
- NP(不适用)
- - 企业/个人用户从欧盟企业欧盟以外 - NP(不适用)。

现在我想知道数据库设计的最佳方法。我们有如下表:

countries 
code VARCHAR(3) PK AI 
NAME VARCHAR(200) NN 

users 
country VARCHAR(3) FK_countries_code 
account_type TINYINT //0 - individual, 1 - company 

当应用税收规则几点适用:
- 用户位置
- 用户帐户类型。

您对数据库设计有什么建议吗?我在考虑改变国家的表格,并在这里应用一些反规范化 - 创建几个列:vat_rate_eu_personal等,但这是一个可怕的想法。我还在关于实施新表格的事情:tax_ratestax_rates_rules当信息将被存储。但是不知道第二个表的结构。

编辑
要清楚:有没有我0%的规则,这就是所谓的NP(不适用)。但是,税收规则有一个主要要求:来自欧盟的公司需要提供有效的VAT ID。这就是为什么我们创建了两种账户类型:公司账户和个人用户。

+0

“对我来说没有0%的规则,它被称为NP(不适用)”。你称之为*的规则并不重要。在计算增值税时,不适用的规则实际上为0%。您不能在同一列中存储数字百分比和字符串('NP');它们是具有不同约束的不同数据类型。 – 2011-12-17 16:17:25

+0

您是否通过查看用户的帐单地址,送货地址或其他信息来确定用户是在欧盟内部还是欧盟以外? – 2011-12-17 16:19:12

+0

@Catcall - 基于提供的地址详细信息的用户国家 - 这就是为什么我们为国家使用单独的表。 – DaveW 2011-12-17 17:01:21

回答

0

有两种方法可以解决这个问题。

  1. 存储每一种可能性。
  2. 只存储有增值税率的可能性> 0

我可能只存储有增值税率> 0

但你的规则看起来很简单,我的可能性,只有两种可能性。

  1. 来自欧盟的个人用户:23%。 (波兰仍是欧盟, 吧?)
  2. 每隔个人和公司在世界:0%

你可以很容易地确定一个用户的国家,无论用户是个人或公司。唯一缺少的是欧盟成员国。

create table EU (
    country_code varchar(3) primary key references countries (code) 
); 

insert into EU values ('PL'); -- or whatever code you use. 
... 

等等。然后,您可以创建查看税率的视图。

create view VAT_rates as 
select 0 account_type, country_code, .23 VAT_rate 
from eu; 
+0

我编辑了我的问题。你是对的。在这种情况下,我们有两种税率,但是我正考虑在数据库中存储特定规则,这是关键:) – DaveW 2011-12-17 13:33:55