SQL Server表设置设计

时间:2012-02-21 17:55:42

标签: sql sql-server

这是一个很难搜索的问题。我尝试过,但我找不到我要找的那种东西。

我会尽力解释这个问题。

我有一个数据库设置,我正在尝试添加一些功能。我对性能,数据冗余和所谓的最佳实践感到担忧。

我在数据库中有多个用户,我正在尝试设置"基准测试"为每个用户。每个用户可以拥有理论上无数的基准(虽然实际上它几乎总是小于5但我不想限制自己)并且每个基准可以为每个YEAR前进提供不同的值集和管理层估计即将到来的3 - 4年的基准。这意味着每年都会存在另一个基准值。

这是一个例子。

人A

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

每个用户和每个基准测试依此类推。

我的问题是:

  • 我应该如何为此设置表格?

选项1 :设置一个基准表,该表与用户和每年的列有关系。我必须每年更新数据库并为新的一年添加另一个专栏,并且它可能会在很长一段时间内失控。

选项2 :为基准名称设置一个表格,其中包含与用户的关系,一个包含年份的表格,以及一个包含与基准和年份有关系的基准数据的表格?这似乎是一种更好的维护方法,但它也意味着相同的基准名称将存在多次,但具有不同的年份和价值。我不必在新的一年里添加一个专栏,只要确保年份表中存在年份。

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

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

2 个答案:

答案 0 :(得分:3)

选项2可能没问题。它将足够快速且更易于维护。如果您担心重复基准名称,您可以将其拆分,以便最终得到:

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

注意:benchmark_names表可能非常小(相对而言),因此额外的连接应该是非常免费的,甚至可以帮助提高大数据集的性能,因为基准ID通常会占用内存少于名字。

答案 1 :(得分: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

如果您创建用户ID,基准名称和年份的复合主键,您甚至可以获得唯一性保证。我没有看到规范出一个只存储可用年份(或基准名称)的表的好处,但这取决于你。