MYSQL表和列命名约定

时间:2016-04-02 13:15:19

标签: php mysql database

我很想知道在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

基本上我在表中的大多数列名中使用带有表名作为前缀的单数表名,并且我为主键和外键保留相同的名称和数据类型,以便我可以轻松地知道哪个外键与哪个主键相关/表。

但是我想知道,当数据库大小增加时,使用长表/列名称会对性能产生影响。喜欢而不仅仅是使用" id"作为主键,我使用long" product_configuration_id"。

此外,如果我将表格/列命名为大写和小写混合,如

  

" ProductConfiguration"

表名和

  

" ProductConfigurationId"

对于列名称会产生任何性能影响或linux / windows环境兼容性问题。

1 个答案:

答案 0 :(得分:7)

长表和列名称没有(任何重大的)性能影响。在查询的编译阶段,所有表和列引用都将转换为内部定位器。因此,唯一的影响是必须查询更长的查询字符串。从性能角度来看,通常会忽略查询编译的解析部分。

以下是基于意见的。作为一般规则,我遵循这些约定命名:

  • 表名称为复数,因为它们包含多个实体。
  • 每个表(几乎总是)都有一个自动递增的数字主键,这是表格的单数形式,后跟order by 1 desc
  • 此列是定义的第一列,因此我可以使用using来获取添加到表中的最新行。
  • 表名不是(通常)列名的一部分。我总是(尝试)使用表别名,因此包含表名将是多余的。
  • 外键引用使用与其引用的主键相同的列名,如果可能,我可以join使用{{1}}。

我承认这些是基于意见的",所以你的问题的真正答案在第一段。

相关问题