LoginSignup
1

More than 5 years have passed since last update.

SQLアンチパターン:メタデータトリブル (メタデータ大増殖)

Posted at

SQLアンチパターンを読み始めたので、1つ1つ書いてのメモです

目的

  • スケーラビリティを高める
  • クエリの実行速度を劣化させずに、データが増加し続けるテーブルに対応できるよう、 データベースの構造を設計すること

アンチパターン

  • テーブルや列をコピーする
CREATE TABLE Customers (
  customer_id NUMBER(9) PRIMARY KEY,
  contact_info VARCHAR(255),
  business_type VARCHAR(20),
  revenue NUMBER(9,2)
);

カラム名に「2002」といった西暦があるカラムを増やしていくと、nullのカラムがどんどん増える

ALTER TABLE Customers ADD (revenue2002 NUMBER(9,2));
ALTER TABLE Customers ADD (revenue2003 NUMBER(9,2));
ALTER TABLE Customers ADD (revenue2004 NUMBER(9,2));

そこで、西暦ごとにテーブルを分割しようとする

CREATE TABLE Bugs_2008 ( . . . );
CREATE TABLE Bugs_2009 ( . . . );
CREATE TABLE Bugs_2010 ( . . . );

2011年のテーブルを作り忘れて不具合発生

  • データの整合性の課題
    • 2009 のテーブルに、2010が入っていた、ということが起こる
  • データの同期
    • 2009年1月3日のデータを、2008年12月28日にupdateすると整合性が保たれない
  • 一意性の保証
    • プライマリーキーの値をつくるためのテーブルが必要になる
  • テーブルをまただいたSQL
    • UNION で
    • 新しい年になれば、SQLの更新が必要になる
  • カラムの追加
    • 全テーブルにする必要がある。そうしないと、UNION の対応が必要になる
  • 参照整合性の管理
    • 外部キーは単一のテーブル指定が必要だけれど、複数テーブルがあるのでできない

用いてもいいパターン

過去データを最新のデータから分離するようなアーカイブが目的のときです。

解決策

パーティショニングと正規化を行う
- 水平パーティショニング
- 垂直パーティショニング
- 従属テーブルの導入

まとめ

データにメタデータを増殖させないように気をつけましょう。

感想

  • ソーシャルゲームの開発のときには、パーティショニングを使っていたので、解決策として正しかったのか、と安心
    • でも、自前でやったらいけない
  • メタデータって?
    • データーのためのデータ
    • 書籍であれば、筆者、出版社
    • 写真であれば、Exif(f値、カメラ、色などなど)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1