SQL效率行或表

时间:2012-01-14 19:00:48

标签: sql database

我正在创建一个保存电动机屈服值的数据库。屈服值存储在Excel文件中,我必须将其传输到数据库。发动机的每次测试都有42行(扭矩)和42列(功率单位为kw),其值存储在这些单元格中。

(kw)         1,0        1,2   ...(42x)
           --------   -------
(rpm)2000     76,2      77,0
     2100     76,7      77,6
      ...
     (42x)

我想到为engine_id,test_id(每个引擎可以有多个测试)创建一个列,并为相应的yield值创建42列。对于每个测试,我必须为单个引擎添加42行并使用yield值。这对我来说似乎没有效率,也不容易实现。

如果单个引擎有42条记录(行),那么数据库将占用几千行,并且搜索具有相应值的特定引擎将是一项令人筋疲力尽的任务。

如果我为特定引擎的每个测试做一个单独的表,再过一段时间后,我可能会有数千个表。现在我该怎么做,一个包含数千条记录的表或一个包含42列和42行的表?无论哪种方式,我仍然有冗余记录。

2 个答案:

答案 0 :(得分:4)

数据库绝对是答案(一旦你掌握了SQL(用于与数据库交互的语言),搜索数百万或数亿行非常容易。我建议使用

EngineId, TestId, TourqueId, PowerId, YieldValue

哪个会有价值......

Engine1,Test1,2000,1.0,73.2

所以只有5列。如果需要,这将使您可以灵活地添加更多的产量结果(或者即使它不是,它只是一个更简单的模式)。但是,您需要学习SQL,以通过电子表格实现数据库的强大功能。此外,有许多技术可以将Excel数据导入SQL,因此您应该对其进行调查(Google it)。如果你发现你正在手动传输所有数据,那么你做错了(真的没错,但效率低!)。

除了您的评论之外,这里还有索引的确切模式(在MS SQL Server中)

CREATE TABLE [dbo].[EngineTestResults](
    [EngineId] [varchar](50) NOT NULL,
    [TestId] [varchar](50) NOT NULL,
    [Tourque] [int] NOT NULL,
    [Power] [decimal](18, 4) NOT NULL,
    [Yield] [decimal](18, 4) NOT NULL,
 CONSTRAINT [PK_EngineTestResults] PRIMARY KEY CLUSTERED 
(
    [EngineId] ASC,
    [TestId] ASC,
    [Tourque] ASC,
    [Power] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO


/****** Object:  Index [IX_EngineTestResults]    Script Date: 01/14/2012 14:26:21 ******/
CREATE NONCLUSTERED INDEX [IX_EngineTestResults] ON [dbo].[EngineTestResults] 
(
    [EngineId] ASC,
    [TestId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

请注意,没有递增的主键...键是(EngineId,TestId,Torque,Power)。要获取特定引擎的结果,您将运行如下查询:

     Select * from EngineTestResults where engineId = 'EngineABC' and TestId = 'TestA'

请注意,我已为该组标准添加了索引。

答案 1 :(得分:1)

关系数据库的优势在于能够跨多个表规范化数据,因此您可以为引擎创建一个表,一个用于测试,一个用于结果。如下所示:

CREATE TABLE tbl__engines (
  `engine_id` SMALLINT UNSIGNED NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  PRIMARY KEY(engine_id)
);

CREATE TABLE tbl__tests (
  `test_id` INT UNSIGNED NOT NULL,
  `engine_id` SMALLINT UNSIGNED NOT NULL,
  PRIMARY KEY(test_id),
  FOREIGN KEY(engine_id) REFERENCES tbl__engines(engine_id)
);

CREATE TABLE tbl__test_result (
  `result_id` INT UNSIGNED NOT NULL,
  `test_id` INT UNSIGNED NOT NULL,
  `torque` INT NOT NULL,
  `power` DECIMAL(6,2) NOT NULL,
  `yield` DECIMAL(6,2) NOT NULL,
  FOREIGN KEY(test_id) REFERENCES tbl__tests(test_id)
);

然后,您只需在这三个表中执行连接即可返回所需的结果。类似的东西:

SELECT
  *
FROM `tbl__engines` e
INNER JOIN `tbl__tests` t ON e.engine_id = t.engine_id
INNER JOIN `tbl__results` r ON r.test_id = t.test_id;