27

构建用于存储管理设置的 MySQL 表的最佳方法是什么?

像这样?

Setting _|_ Value
setting1 |   a
setting2 |   b
setting3 |   c
setting4 |   d
setting5 |   e

还是像这样?

|--------|_setting1_|_setting2_|_setting3_|_setting4_|_setting5_|
Settings |    a     |    b     |    c     |    d     |    e     |

或者也许有其他方式?

4

5 回答 5

32

表名 = '设置'

name  | varchar <-- primary key
value | varchar

然后你可以这样查询:

SELECT * FROM settings WHERE name = 'default_printer';

这个选项既好又简单,它适用于 10 或 10,000 个设置。使用另一个选项,您必须添加一个新列,这完全是浪费时间。

编辑

在您的第一条评论之后,您可以选择多个值,如下所示:

SELECT * FROM settings WHERE name IN ('default_printer','default_page_size');

:-)

于 2010-03-18T11:48:31.973 回答
4

将第一个选项 ( Setting, Value) 视为列。但也可以考虑添加额外的元列,例如Description(如果您有很多不明确的设置会派上用场)PreviousValue、、、、LastUpdatedUpdatedBy

于 2013-12-24T07:54:03.163 回答
1

您的第一个示例,名称-值对或 EAV,提供了更大的灵活性。

查看有关数据库中 EAV 建模的 wiki 页面

于 2010-03-18T11:51:26.463 回答
0

像往常一样,这取决于。解决方案1更简单。Sol #2 很容易与 ORM 集成,但可能会遇到 DB 行大小限制。Google for OTLT(如在一个真正的查找表问题中)你有多少设置(几个?几十个?几百个?)你多久需要一次?

于 2010-03-18T11:48:49.323 回答
0

事实上,这一直是我的挑战。每个都有自己的优点和缺点,尽管我有时会在项目中使用这两个示例,这取决于它的使用位置。

第一个更多的是当用户要在数据库中的键下保存站点的某些设置并且它是动态的,这意味着可以随时添加一些东西。即使您作为开发人员也希望每时每刻都添加新的东西。因为通过添加一条记录作为新的键,您不需要重新构建数据库和模型的结构,并且可以节省时间。在此结构中,您不能为每个数据指定特定类型。
示例:http ://sqlfiddle.com/#!9/1ab8aa/1/1

但在第二种情况下,添加新密钥取决于更改数据库的结构和更改模型。当您拥有不会每次都更改的固定和特定键时,更是如此。但是,例如,如果要针对特定​​语言或特定用户组对设置进行分类,则此方法仍然使任务更加容易,因为每个记录都可以针对特定用户或特定语言。在这种情况下,查询这个结构比以前的方法更容易。在这个结构中,你可以通过字符串、数字、日期等设置和验证数据。
示例:http ://sqlfiddle.com/#!9/b99d52/1/1

于 2021-08-21T22:48:49.370 回答