【问题标题】:Vertical partitioning of composite keys复合键的垂直分区
【发布时间】:2013-01-27 05:30:40
【问题描述】:

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

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`)
)

其中data.superKeys_idsuperKeys.id 的外键。

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

在我的实际情况中,其中一个资源是 user_id,我经常需要对用户的值求和,所以我可能会在 data 中保留这样一个列,而不是让它成为 @ 的一部分987654331@ 表是为了不必加入每个查询。然后只在我需要对其他资源的值求和时才使用联接,这将不那么频繁。

【问题讨论】:

  • 也许省略代理键 id alltogether ?如果 res1 ... res5 是一个自然的唯一键,那么另一个键将是多余的。
  • 您是否需要比较多于或少于 5 个资源?这似乎是一个高度非规范化的架构。
  • 是的,可以进行垂直分区以最小化表的“热”半部分的 I/O。 但是,这仅适用于大型表,而 2000 万在现代硬件上并不真正符合“大型”的条件,如 @Catcall so eloquently explained(+1 给他)。
  • 顺便说一句,您的模型缺少任何(主或备用)键。唯一的 index 和唯一的 key 不是一回事,仅仅声明一个字段 AUTO_INCREMENT 和创建一个真正的主键是不同的。即使您使用的是容易混淆这些东西的 MySQL,也请使用正确的术语。
  • @Branko - 非常抱歉忘记指明 PRIMARY KEY。

标签: database-design composite-key


【解决方案1】:

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

五个整数是 40 个字节。乘以 2000 万--800 兆字节,加上一个日期时间列和一个小数。整张桌子可以放入我的 netbook 上的 RAM。

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

【讨论】:

  • 我的示例中有一个错误,我在 superKeys 上放置了一个值列。话虽如此,在第 1 天可能有 10,000 个 res1 到 res5 的唯一组合,在第 2 天可能有 10,000 个,但在这 2 天中,可能只有 12,000 个唯一组合 - 绝对不是 20,000 个。所以data 中会有 20,000 行,但superKeys 中只有 12,000 行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 2011-10-30
  • 2014-09-23
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 2014-09-16
相关资源
最近更新 更多