2012-02-21 121 views
0

这是一个非常难以搜索的问题。我确实尝试过,但我没有找到我期待的东西。SQL Server表设置设计

我会尽我所能解释这一点。

我有一个数据库设置,我试图在添加一些功能。我担心性能,数据冗余和所谓的最佳实践。

我在数据库中有多个用户,我试图建立“基准”为每个用户。每个用户可以有一个理论上无限的基准(尽管实际上它几乎总是小于5,但我不想限制自己),并且每个基准对于每个年度都有不同的价值观,并向前推进和管理估计未来3 - 4年的基准。这意味着每年将有另一个基准值存在。

这里是一个例子。

某甲

Benchmark 1: 2010, 2011, 2012, 2013, 2014, 2015 
Benchmark 2: 2010, 2011, 2012, 2013, 2014, 2015 

因此,对等为每个用户和每个基准。

我的问题是这样的:

  • 我应该怎样建立这个表?

选项1:设置与每年的用户和列有关系的基准表。我将不得不每年更新数据库并为新的一年添加另一列,并且它可能在极长的时间内失控。

选项2:为与用户有关系的基准测试名称,具有年份的表格和基准数据与基准和年度有关系的表格建立一个表格?这对于维护而言似乎是一种更好的方法,但它也意味着同一个基准测试名称会存在多次,但具有不同的年份和价值。我不需要在新的一年添加一列,只需确保年份存在于年份表中即可。

选项3:东西你们告诉我,是一个更好的选择?我希望。

假设数据集很大,并且有很多用户。

回答

3

选项2可能没问题。这将是很快,更可维护。如果你担心重复基准名称,你可以拆分出来过,所以你最终有:

benchmark_names(benchmark_id, name) 
benchmarks(benchmark_id, user_id, year, value) 

注:benchmark_names表想必会非常小(相对),所以多余的加入应该是相当很多免费,甚至可能有助于大型数据集的性能,因为基准ID通常占用的内存比名称少。

+0

我看不到您的usersXbenchmarks表的目的。基准表中的user_id用于此目的。 – Bill 2012-02-21 18:16:33

+0

@Bill - 好点。 – 2012-02-21 18:30:36

1

为什么不直接对用户ID的列,基准名称,年份和价值?例如:

user_id | bm_name | bm_year | value 
1234 | "SomeBM" | 2001 | 5 
1234 | "SomeBM" | 2002 | 6 
1234 | "SomeBM" | 2003 | 7 
1234 | "SomeBM" | 2004 | 8 

如果您制作用户标识,基准名称和年份的组合主键,则您甚至可以获得唯一性保证。规范化只存储可用年数(或基准名称)的表格,我看不到很多好处,但这取决于您。