Sql server 2008 多设置的垂直或水平t-sql表?

Sql server 2008 多设置的垂直或水平t-sql表?,sql-server-2008,tsql,Sql Server 2008,Tsql,假设您需要一个表来存储设置。例如,我想将车辆设置存储在一个表中,但有100多个设置,因此最好有一个包含100列的表,或者一个包含2列的表(1列表示设置的名称,1列表示设置的值)?我完全赞成标准化。因此,我将创建三个表:Vehicle、Setting和VehicleSetting,这三个表将包含Vehicle id、Setting id和Setting value的三列。事实上,我在生产中有这个实现。“我的设置”表还具有默认值,如果用户未明确指定该值,则会存储该值 如果您决定将来添加设置,这种方法

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

我完全赞成标准化。因此,我将创建三个表:Vehicle、Setting和VehicleSetting,这三个表将包含Vehicle id、Setting id和Setting value的三列。事实上,我在生产中有这个实现。“我的设置”表还具有默认值,如果用户未明确指定该值,则会存储该值


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

我完全支持规范化。因此,我将创建三个表:Vehicle、Setting和VehicleSetting,这三个表将包含Vehicle id、Setting id和Setting value的三列。事实上,我在生产中有这个实现。“我的设置”表还具有默认值,如果用户未明确指定该值,则会存储该值


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

各有利弊

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

如果每行使用一个设置

  • 将来添加新设置或删除不需要的设置将更容易,而无需更改表架构
  • 您可以使用一个用户界面来执行此操作,而无需触摸数据库
  • 您的客户可以添加/删除设置,而无需引起您的注意

  • 您可能需要记住设置关键字no intellisense
  • 循环,光标
百栏进近

  • 智能感知
  • 这只是一张唱片,应该快一点
  • 没有循环,没有光标

  • 如果列不可为空,则可能必须填充所有列
  • 更改架构时,可能必须更改所有依赖代码

    • 两者各有优缺点

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

      如果每行使用一个设置

      • 将来添加新设置或删除不需要的设置将更容易,而无需更改表架构
      • 您可以使用一个用户界面来执行此操作,而无需触摸数据库
      • 您的客户可以添加/删除设置,而无需引起您的注意

      • 您可能需要记住设置关键字no intellisense
      • 循环,光标
      百栏进近

      • 智能感知
      • 这只是一张唱片,应该快一点
      • 没有循环,没有光标

      • 如果列不可为空,则可能必须填充所有列
      • 更改架构时,可能必须更改所有依赖代码

      我并不反对迪米特里的回答,但提出了另一面

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

      如果每个设置都是一列,则对新属性进行程序更改。更简单的查询语法。如果它们是单值属性,那么我认为您仍然有第三范式和更高效的查询

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


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

      我并不反对迪米特里的回答,但我提出了另一面

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

      如果每个设置都是一列,则对新属性进行程序更改。更简单的查询语法。如果它们是单值属性,那么我认为您仍然有第三范式和更高效的查询

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


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

      所有设置是否都是相同的数据类型?它们是否总是相同的?它们并非都是相同的数据类型。所有设置是否都是相同的数据类型?它们会一直是吗?它们不都是相同的数据类型。