我很想知道就mysql表名和列名的性能而言,什么是最好的命名约定。我正在为我的项目设计一个新的数据库。
到目前为止,我使用的是描述性的表/列名,有时看起来很长,但我认为这有助于轻松理解表的用途/功能。
例如,请参阅以下DDL:
CREATE TABLE `product_configuration` (
`product_configuration_id` int(11) NOT NULL AUTO_INCREMENT,
`product_id` int(20) NOT NULL,
`product_size_id` int(20) NOT NULL,
`product_color_id` int(20) NOT NULL,
`price` float NOT NULL,
`image` varchar(255) DEFAULT NULL,
`locked` tinyint(1) DEFAULT '0' COMMENT '1=locked, 0 =unlocked. if locked then this row can''t be deleted/updated',
`active` tinyint(1) DEFAULT '1' COMMENT '1=active, 0=inactive and wont display on frontend',
PRIMARY KEY (`product_configuration_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2342 DEFAULT CHARSET=latin1
还有另一个DDL,我使用上面DDL中的主键作为外键:
CREATE TABLE `product` (
`product_id` int(11) NOT NULL AUTO_INCREMENT,
`product_name` varchar(255) NOT NULL,
`product_description` varchar(255) NOT NULL,
`product_image` varchar(255) NOT NULL,
`price` float NOT NULL,
`active` tinyint(1) NOT NULL COMMENT '1=active, 0=inactive',
`date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`product_type_id` int(11) DEFAULT NULL,
`date_modified` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`product_id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=latin1
基本上,我在该表中的大多数列名中都使用以表名为前缀的单数表名,并且我对主键和外键保持相同的名称和数据类型,这样我就可以很容易地知道哪个外键与哪个主键/表相关。
但我想知道,当数据库大小增长时,使用长表/列名是否会对性能产生影响。就像我使用长的"product_configuration_id"而不是仅仅使用"id"作为主键一样。
此外,如果我像一样以大小写混合的形式命名表/列
"产品配置"
用于表名和
"产品配置ID"
对于列名会有任何性能影响或linux/windows环境兼容性问题。
长表和列名不会对性能产生(任何重大)影响。在查询的编译阶段,所有表和列引用都将转换为内部定位器。因此,几乎唯一的影响是必须查询更长的查询字符串。从性能的角度来看,查询编译的解析部分通常被忽略。
以下是基于意见的。一般来说,我遵循以下命名约定:
- 表名是复数形式,因为它们包含多个实体
- 每个表(几乎总是)都有一个自动递增的数字主键,它是后面跟着
Id
的表的单数形式 - 此列是定义的第一列,因此我可以使用
order by 1 desc
来获取添加到表中的最新行 - 表名(通常)不是列名的一部分。我总是(尝试)使用表别名,所以包含表名是多余的
- 如果可能的话,外键引用使用与它们引用的主键相同的列名,所以我可以将
using
用于join
s
我承认这些都是"基于观点的",所以你的问题的真正答案在第一段。