mysql - 当我们将多个列引用到一个表而不是单独的表时,是否会影响性能?

标签 mysql database join

我有一个这样的数据库设计。我正在使用 MYSQL。 有一个车辆表来存储有关车辆的信息

CREATE TABLE `test`.`vehicle` (
`vehicle_id` BIGINT UNSIGNED NOT NULL,
`fuel_type_id_ref` TINYINT UNSIGNED NULL DEFAULT NULL,
`drive_type_id_ref` TINYINT UNSIGNED NULL DEFAULT NULL,
`condition_id_ref` TINYINT UNSIGNED NOT NULL,
`transmission_type_id_ref` TINYINT UNSIGNED NULL DEFAULT NULL,
PRIMARY KEY (`vehicle_id`)
) ENGINE = INNODB CHARSET = latin1 COLLATE = latin1_swedish_ci ;

我使用单独的表来存储每个引用 ID 的记录。 例如:我有一个燃料类型表来存储燃料,变速箱类型表等等。

但现在我发现这些表的架构几乎是等价的。 所以创建了一个这样的表。

CREATE TABLE `test`.`vehicle_feature` (
  `veh_feature_id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `feature_type_id_ref` TINYINT UNSIGNED NOT NULL,
  `name` VARCHAR (50) NOT NULL,
  `is_active` TINYINT (1) NOT NULL DEFAULT TRUE,
  PRIMARY KEY (`veh_feature_id`)
) ENGINE = INNODB CHARSET = latin1 COLLATE = latin1_swedish_ci ;

我将所有这些燃料和传输类型放入此表中,并使用特征类型 ID 来标识组。 现在我必须一次又一次地连接同一个表以从我的车辆表中检索值。

所以我的问题是。

我应该维护我的单独表格还是应该采用这种新方法?因为我必须一次又一次地编写相同的连接,所以我的代码没有减少。我可以轻松加入我的小 table 而不是这张 table 。此外,如果我使用小表,我可以使用内部连接来连接这些表,但在这里我必须使用左连接来连接表。与一个表相比,单独的表的记录也更少。这种方法所做的就是减少我的数据库的表(只有 4 个我不关心的表)。这 4 个表中所有记录的总和为 100 条记录。

那么什么是性能方面的好处呢?

最佳答案

这个问题有点难,因为这些都是合理的方法。决定的关键是了解应用程序需要从此类数据中获得什么。

项目的单独表有一个很好的优势,因为外键约束实际上可以检查数据的参照完整性。此外,每个实体都被视为成熟的真实实体。如果您有关于特定于该实体的燃料、驱动器和传输的其他信息,这将很方便。例如,燃料可以有辛烷值,它可以在燃料表中,但不需要与其他引用表混淆。

另一方面,您最终可能会得到很多类似的引用表。而且,对于您的应用程序,这些可能不需要是成熟的实体。在那种情况下,只有一个表是很合理的。如果你想国际化你的应用程序,这实际上是一个更大的优势。也就是说,如果您想以多种语言提供事物的名称。

在面向对象的语言中,您可以使用继承来解决这个问题。这三种“类型”都是一类车辆属性的“子类”。不幸的是,SQL 没有这样的内置概念。

从性能的角度来看,这两种方法都涉及相对较小的引用表(我猜最多几千行),这些表通过主键访问。这两种方法之间的性能差异应该很小。重要的问题是如何为您的应用程序正确建模数据。

关于mysql - 当我们将多个列引用到一个表而不是单独的表时,是否会影响性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28516596/

相关文章:

mysql - 找不到基表或 View Magento

mysql - SQL 连接以获得精确结果

mysql:两个表但三个选择条件

java - Thread.join()(实例方法)

mysql - 在 MySQL 存储过程中使用参数 WHERE-CLAUSE 会降低性能

mysql - 半径接受所有,但拒绝客户端?

mysql - 从 ID 匹配的两个表中选择全部

mysql - 优化多个IN的mysql子查询

java - 如何确定连接池中所需的连接数?

database - Sql 或 Reports 的验收测试