毎日、さまざまなリソースの組み合わせの値を追跡する必要があります。したがって、これを行うテーブルは次のようになります。
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`)
)
res1
~ ~は、res5
それぞれのテーブルへの外部キーです。
このテーブルには多くの行が含まれ、簡単に 2,000 万に達するでしょう。
私が興味を持っているのは、外部キーの組み合わせを別のテーブルに入れ、次のような 2 つのテーブルを作成する必要があるかどうかです。
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_id
への外部キーsuperKeys
です。id
.
これにより、テーブルのサイズが大幅に縮小されます。しかし、私が知らない理由でそれが悪い考えであるかどうかはわかりません。明らかに、選択ではデータの内訳を取得するために結合が必要になりますが、これによりオーバーヘッドが少し追加されますが、これが問題になるとは思わないでください。
私の現実の状況では、リソースの 1 つは user_id であり、ユーザーの値を頻繁に合計する必要があるため、そのような列をテーブルdata
の一部にするのではなく、そのままにしておくでしょう。superKeys
すべてのクエリに参加します。次に、他のリソースの値を合計する必要がある場合にのみ結合を使用しますが、これはそれほど頻繁ではありません。