复合键的垂直分区

时间:2013-02-12 00:33:13

标签: database-design composite-key

我必须每天跟踪不同资源组合的值。因此,执行此操作的表可能如下所示:

CREATE TABLE `data` (
  `id` INT UNSIGNED NULL PRIMARY KEY AUTO_INCREMENT,
  `datetime` DATETIME NOT NULL,
  `res1` INT UNSIGNED NOT NULL,
  `res2` INT UNSIGNED NOT NULL,
  `res3` INT UNSIGNED NOT NULL,
  `res4` INT UNSIGNED NOT NULL,
  `res5` INT UNSIGNED NOT NULL,
  `value` DECIMAL(10,0) NOT NULL,
  UNIQUE INDEX `datetime_res1_to_res5` (`datetime`, `res1`, `res2`, `res3`, `res4`, `res5`)
)

其中res1res5是其各自表的外键。

这个表将包含很多行 - 很容易破解2000万。

我很好奇的是,我是否应该将外键组合放到一个单独的表中,这样我就有两个这样的表:

CREATE TABLE `data` (
  `id` INT UNSIGNED NULL PRIMARY KEY AUTO_INCREMENT,
  `datetime` DATETIME NOT NULL,
  `superKeys_id` INT UNSIGNED NOT NULL,
  `value` DECIMAL(10,0) NOT NULL,
  UNIQUE INDEX `datetime_superKeys_id` (`datetime`, `superKeys_id`)
)

CREATE TABLE `superKeys` (
  `id` INT UNSIGNED NULL PRIMARY KEY AUTO_INCREMENT,
  `res1` INT UNSIGNED NOT NULL,
  `res2` INT UNSIGNED NOT NULL,
  `res3` INT UNSIGNED NOT NULL,
  `res4` INT UNSIGNED NOT NULL,
  `res5` INT UNSIGNED NOT NULL,
  UNIQUE INDEX `res1_to_res5` (`res1`, `res2`, `res3`, `res4`, `res5`)
)

其中datasuperKeys_idsuperKeys的外键。id

这将显着减小表的大小。但由于我不知道的原因,我不确定这是不是一个坏主意。显然,选择将需要连接才能获得数据细分,这会增加更多的开销,但我不认为这会是一个问题。

在我的实际情况中,其中一个资源是user_id,我经常需要对用户的值求和,所以我可能会在data中保留这样一个列,而不是让它成为superKeys表,以便不必加入每个查询。然后,当我需要对其他资源的值求和时,只使用连接。

1 个答案:

答案 0 :(得分:1)

它不会减小数据的大小。你必须在一个表中存储2000万行数据,在另一个表中存储2000万行超级密钥。

五个整数是40个字节。乘以2000万 - 800兆字节,加上日期时间列和小数。整个表格适合我的上网本中的RAM。

保持表格“数据”。删除代理键。