0

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

4

3 回答 3

1

我完全赞成正常化。因此,我将创建三个表:Vehicle、Setting 和 VehicleSetting,其中包含车辆 ID、设置 ID 和设置值的三列。实际上我在生产中确实有这个实现。如果用户没有明确指定值,我的设置表也有存储的默认值。

如果您决定将来添加设置,这种方法非常方便。无需修改表并可能面临重构,您只需将另一条记录添加到设置表即可。

于 2012-07-09T19:10:16.550 回答
1

两者都有其优点和缺点。

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

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

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

但是

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

100列方法

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

但是

  • 如果它们不可为空,您可能必须填充所有列
  • 更改架构,您可能必须更改所有依赖代码
于 2012-07-09T19:30:19.083 回答
1

我不同意 Dimitri 的回答,但提出了另一面。

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

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

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

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

于 2012-07-09T19:30:24.837 回答