繁体   English   中英

简单的MySQL表设计

[英]Simple MySQL table design

我想我应该算作数据库新手,所以把这个问题看成是一个新手问题。 我目前创建了一个表,它包含许多主机的环境变量,如下所示:

create table envs ( 
  host varchar(255), 
  envname varchar(255), 
  envvalue varchar(8192), 
  PRIMARY KEY(host, envname)
);

非常简单,一张表包含我需要的所有数据。 常见操作是获取给定主机的所有环境变量,另一个是获取给定主机的给定环境变量,第三个示例操作是获取所有主机的给定环境变量并列出重复项。

性能预计不会成为问题,它可能是数十台主机,每台主机数十个变量,平均每秒最多1次查询。

现在我已经读过,拥有复合主键并不一定是个好主意。 对于上述用例,这是真的吗? 如果是这样,我该如何更改数据库设计? 如果没有,上面的单表数据库是否适用于我上面列出的目的?

我没有看到主键的问题。 主键的语义是唯一地标识键值的非键属性值。 我假设对于一个主机和一个envname,最多只有一个envvalue,主键很有意义。

可能有些人反对复合主键,因为他们害怕性能问题。 但是,性能考虑永远不应影响主键的选择。 许多数据库系统自动为主键创建索引结构; 这种指数结构的选择会影响绩效。 但是,这种选择大多可以手动更改,如果确实存在性能问题,应该在以后完成。

您的单桌设计和主键选择都很好。

现在我已经读过,拥有复合主键并不一定是个好主意。 对于上述用例,这是真的吗?

否。在(host, envname)上使用复合主键。

如果是这样,我该如何更改数据库设计?

N / A。

如果没有,上面的单表数据库是否适用于我上面列出的目的?

是的:它被称为实体 - 属性 - 值模型

这是一个糟糕的主意,因为你存储唯一值(主机,ENVNAME) 几次

如果您要将主机名从srv01更改为* srv01_new *怎么办? 您必须更改表中srv01的 每个发生次数 如果有一天你决定需要创建一个包含每个主机的附加信息的新表,那该怎么办呢?

现在,如果更改主机名,则还必须更改这些信息。

提出你的问题:这不是性能问题,而是规范化问题

数据库通常应尽可能标准化。 如果您足够感兴趣, 请继续阅读

您应该为主机创建一个表,其中唯一的id (int)作为主键,唯一(索引) 名称作为主机名。

然后,您的表应仅引用主机的ID ,而不是名称 这样,您的主机名只会在整个数据库中存储一次 ,并且可以更改为您想要的任何内容,而不会破坏其他表。


如果您的环境名称也是唯一的,则应为这些创建另一个表,其布局与hosts表(id,name)相同。

然后,组合表将存储主机ID和环境ID以及值。 您当然必须保留组合的主键,因此主机/环境的每个组合都是唯一的且易于索引。

然后,您与其他属性和完美规范化具有多对多关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM