Sqlap teppei696
- 1. テーブル構造
BugStatus
Tags
Bugs Accounts
Scrennshots
Products BugsProducts Comments
- 2. 1.ジェイウォーク(信号無視)
【目的】
複数の値を持つ属性を格納する
※Productsを担当するAccountsを定義したい
【アンチパターン】
カンマ区切りフォーマットのリストを格納
※Productsテーブルにaccount_id列(VARCHAR(100))を追加し、
「111,222,333」とカンマ区切りでaccount_idを登録する
【解決策】
交差テーブルを作成する
Products Accounts
Products Contacts Accounts
- 4. 3.IDリクワイアド(とりあえずID)
【目的】
全てのテーブルが主キーを持つこと
【アンチパターン】
CREATE TABLE Bugs (
冗⻑なキー
id SERIAL PRIMARY KEY,
bug_id VARCHAR(10) UNIQUE,
description VARCHAR(10000),
…
);
【解決策】
状況に応じて適切に調整
※自然キーと複合キーを使おうね
※ORMフレームワークだと「id」固定?⇛書き換え可能
- 6. 5.EAV(エンティティ・アトリビュート・バリュー)
【目的】 Issue Bug
可変属性をサポート + Date_reported + Severity
+ Reporter + Version_affected
+ Priority
+ Status
FeatureRequest
+ Sponsor
【アンチパターン】 Issues
Issue
Attributes
汎⽤的な属性テーブル
【解決策】
まず、しっかり設計
※サブタイプ数が限られていたら「継承」を利⽤
※本当にサブタイプ数が可変なのであれば、LOB列にXML、JSONで格納
- 7. 6.ポリモーフィック関連
【目的】 Bugs
複数の親テーブルを参照
Comments
Feature
Requests
【アンチパターン】
二重目的の外部キーを使⽤する
CREATE TABLE Comments (
comment_id SERIAL PRIMARY KEY,
issue_type VARCHAR(20), -- Bugs or ReatureRequest
issue_id BIGINT UNSIGNET NOT NULL
…
);
【解決策】
Bugs
リレーションシップの単純化 Bugs
Comments
※参照が逆 Comments
※交差テーブルの作成 Feature Features
Requests Comments
- 8. 7.マルチカラムアトリビュート(複数列属性)
【目的】
複数の値を持つ属性を格納する
※Bugsにタグを付ける
【アンチパターン】
複数列を定義
CREATE TABLE Bugs (
bug_id SERIAL PRIMARY KEY,
discriptiosn VARCHAR(1000),
tag1 VARCHAR(20),
tag2 VARCHAR(20),
…
);
【解決策】
従属テーブルを作成 Bugs tags
- 9. 8.メタデータトリブル(メタデータ大増殖)
【目的】
スケーラビリティを高める
※データが増加し続けるテーブルに対応
【アンチパターン】
テーブルや列をコピーする
CREATE TABLE Bugs_2008 ( ...);
CREATE TABLE Bugs_2009 ( ...);
CREATE TABLE Bugs_2010 ( ...);
【解決策】
パーティショニングと正規化
- 13. 12.インデックスショットガン(闇雲インデックス)
MENTORに基づいて効果的な
Index
【解決策】
Measure (測定)
Explain (解析)
Nominate(指名)
Test (テスト)
Optimize(最適化)
Rebuild (再構築)