【问题标题】:MySQL table structure for config data用于配置数据的 MySQL 表结构
【发布时间】:2014-09-20 18:40:55
【问题描述】:

对于配置数据之类的东西,我一直使用以下表结构:

  • id(int11) 主要 AI
  • 名称(varchar255)
  • 值(varchar255)

可能的行如下:

  • (1) site_name > '我的网站'
  • (2) admin_email > 'some@email.com'

虽然这可行,但我觉得它没有达到配置相关数据的一般目的:

  • 它可以包含多个同名的条目>值关系。我可以有多个“背景颜色”条目。
  • 表格感觉很笨重,因为 ID 列是不必要的。

克服上述问题的最佳实践或方法是什么,创建一个仍可被索引并具有唯一“名称”值的表,但显然仍要考虑其他表可能与上表?

【问题讨论】:

  • 您的name 显然应该是唯一的密钥,除此之外我认为我无法提出任何建议。
  • 如果你有两行name = 'duck',你怎么知道使用哪个?您需要某种标识符,例如条目类型或其他内容。
  • 您也可以将“名称”列设为主键
  • 是否最好放弃id,因为它并没有真正被使用并让name成为主要/唯一?还可能出现哪些性能问题?一个站点实际上只有这么多的配置数据,将 varchar 列作为主要列会对最多 50 行的性能产生影响吗?

标签: php mysql sql database-design


【解决方案1】:

您可以为name 字段添加唯一键。这将防止表中出现双重名称。

ALTER IGNORE TABLE tablename ADD UNIQUE (name);

提示:来自manual

IGNORE 是标准 SQL 的 MySQL 扩展。它控制如何改变 如果新表中的唯一键有重复项,则 TABLE 有效,或者 如果启用严格模式时出现警告。如果 IGNORE 不是 指定,如果重复键错误,副本将中止并回滚 发生。如果指定了 IGNORE,则仅使用一行 在唯一键上重复。其他冲突的行被删除。 不正确的值被截断为最接近的匹配可接受 价值。

【讨论】:

  • 老实说,我不知道更好或它可能对性能产生什么影响(所以如果我错了,请纠正我)但是将 name 设为主键/唯一不是更好吗?删除 ID 因为一个人不会真正根据id 进行查询,而是喜欢(从config 中选择value where name='site_name')?
  • @chresse 您的第二个“编辑”有点多余。添加UNIQUE 约束将始终添加索引。
  • @chresse 它可以强制唯一约束的唯一方法是对其进行索引,因此在这种情况下,单词 index 是完全可选的,不会改变任何东西。
  • 我更正了它。我对此有点困惑,因为手册有 2 个部分(添加和不添加索引)。所以我认为最好同时描述两者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 2015-11-19
相关资源
最近更新 更多