垂直或水平t-sql表用于多种设置?

时间:2012-07-09 18:50:45

标签: sql-server-2008 tsql

假设您需要一个表来存储设置。例如,我想将车辆设置存储在一个表中,但是有超过100个设置,因此最好有一个包含100列的表或一个可能包含2列的表(1表示设置名称,1表示设定值)?

3 个答案:

答案 0 :(得分:1)

我全都是为了正常化。所以我会创建三个表:Vehicle,Setting和VehicleSetting,它们有三列用于车辆ID,设置id和设置值。实际上我确实在生产中有这个实现。如果用户未明确指定值,我的设置表也会存储默认值。

如果您决定在将来添加设置,这种方法非常方便。您只需将另一条记录添加到设置表中,而不是修改表格并可能面临重构,您就可以开始使用了。

答案 1 :(得分:1)

要么有其优势和劣势。

为了灵活性,我会选择Vertical(每行中的每个设置)方法

如果您每行使用一个设置,

  • 将来更容易添加新设置或删除不需要的设置,而无需更改表架构。
  • 您可以使用用户界面执行此操作,而无需触及数据库
  • 您的客户可以在不要求您注意的情况下添加/删除设置

BUT(S)

  • 您可能需要记住设置关键字,没有intellisense
  • 循环,光标

100列方法

  • 智能感知
  • 这只是一条记录,应该更快
  • 没有循环,没有光标

BUT(S)

  • 如果列不是NULLable,则可能必须填写所有列
  • 更改架构,您可能需要更改所有相关代码

答案 2 :(得分:1)

我不同意迪米特里的答案,但是提出另一方。

12或100查看您希望设置更改的频率。

如果每个设置都是一列,那么您可以更改新属性的程序。更简单的查询语法。如果它们是单值属性,那么我认为你仍然有第三种常规形式和更有效的查询。

如果您使用Dimitri建议的3个表,那么您的设计稍微复杂一些,但您可以添加和修改属性运行时。对于多个连接,查询将更复杂。您可以在设置表上构建查询以构建您的真实查询。我肯定会使用tcoder建议的游标连接。

如果您有.NET或其他前端,那么您也可以通过读取设置表来构建查询。如果你像GridView一样绑定你将无法生成列,但再也没有那么多工作。