6

有人建议移动一个充满设置的表格,其中每一列是设置名称(或类型),行是客户及其各自的设置。

身份证 | 管理员 | 图像路径
------------------
12 | 1 | \path\to\images
34 | 0 | \路径\到\图像

这样做的缺点是每次我们想要一个新的设置名称(或类型)时,我们都会更改表(通过 sql)并添加新的(列)设置名称/类型。然后更新行(以便每个客户现在都有该设置的值)。

新的桌子设计方案。建议有一个用于设置名称的列和另一个用于设置的列。
身份证 | 设置名称 |
设置值---------------- 12
| 管理员 | 1
12 | 图像路径 | \path\to\images
34 | 管理员 | 0
34 | 图像路径 | \路径\到\图像

他们提出的观点是,添加新设置就像对行的简单插入语句一样简单,无需添加列。

但是第二种设计感觉有些不对劲,它看起来很糟糕,但我无法提出任何反对它的论据。我错了吗?

4

3 回答 3

2

这是“实体属性值”模式的变体(乔尔随机 SO 问题

它有一些优点和更多的缺点,而且它几乎肯定会以眼泪告终。

于 2010-03-08T18:13:15.823 回答
1

第二种方法实际上类似于字典。由于您提到的原因,我发现这对于我正在开发的应用程序来说是一个更方便的选择。这种方法有一些注意事项,因此您需要注意它们:

  • 保持你的键字符串静态,永远不要重命名。
  • 确保每次检索设置字典时都将其更新到最新版本(通常通过添加键和设置默认值/提示用户)。
  • 混合字符串和十进制数据是很棘手的,您需要选择一个或提供多个可为空的列,以便您可以以适当的格式存储数据。将元数据保存在某个地方。
  • 处理字典的代码应该以强类型的方式包装它,永远不要将它公开为真正的字典(在数据结构的意义上),而是提供一个类。
于 2010-03-08T17:57:04.890 回答
0

使用列名来区分设置通常是一个糟糕的主意。您正在处理的实体是 SETTING,它具有 NAME 和 VALUE 属性。如果您需要在不同的上下文中使用相同的名称,请使 SETTING 分层,即除根以外的每个设置都有一个父级。然后,您的客户可以将根作为其父级,并且每个客户下的路径对于每个设置都是相同的。如果需要,您可以将不同的列用于其他数据类型。

于 2010-03-08T17:57:32.393 回答