Schema Design

資料庫データベース Schema 設計せっけいガイド。Schema 類型るいけい正規化せいきか流程フローと MongoDB 設計規則せっけいきそく網羅もうら

Schema Types

Relational Model

関連式リレーショナルモデルはもっと一般的いっぱんてき資料庫データベースモデルで、テーブル(Table)を使用しようして資料データ組織そしきし、主鍵しゅけん(Primary Key)と外鍵がいけん(Foreign Key)でテーブルかん関係かんけい確立かくりつする。

Star Schema

Star Schema は簡単性かんたんせい性能せいのう查詢クエリ便利性べんりせい最優先さいゆうせん場面ばめんてきしている。

適用例てきようれい

  • Retail Sales Analysis(小売こうり販売はんばい分析ぶんせき
  • Financial Reporting(財務ざいむ報表レポート
  • Marketing Campaign Analysis(マーケティング活動かつどう分析ぶんせき
  • Inventory Management(在庫ざいこ管理かんり

Star Schema の特徴とくちょう

  • 中心ちゅうしんFact Table事実表じじつひょう)、度量値どりょうちふくむ(販売額はんばいがく数量すうりょうなど)
  • 周囲しゅういDimension Tables維度表ディメンションテーブル)、記述的きじゅつてき情報じょうほう提供ていきょう時間じかん商品しょうひん地域ちいきなど)
  • 構造こうぞう単純たんじゅんで、查詢クエリ性能せいのう良好りょうこう

Snowflake Schema

適用例てきようれい

  • Customer Relationship Management (CRM)
  • Healthcare Data Analysis(医療いりょうデータ分析ぶんせき
  • E-commerce Platform(電商でんしょうプラットフォーム)
  • Supply Chain Management(サプライチェーン管理かんり

Snowflake Schema の特徴とくちょう

  • Star Schema の正規化せいきかばん
  • Dimension Tables をさらに多層構造たそうこうぞう分割ぶんかつ
  • 資料冗餘データじょうちょう減少げんしょうするが、查詢クエリ複雑ふくざつになる

RDB Design Steps

Step 1: Write a Sentence

保存ほぞんする資料データ一文いちぶん記述きじゅつする:

  • Store the customer information and the orders that they made
  • Store the car and the showroom that they are located in
  • Store the students and the courses they are enrolled in at a specific date

Step 2: Pick Objects From Sentence

ぶんから主要しゅようオブジェクトを抽出ちゅうしゅつ

  1. customer information
  2. orders
  3. car
  4. showroom
  5. students
  6. courses
  7. date

Step 3: Determine Relationship

自問じもん Does object-1 have many object-2s, or does object-2 have many object-1s?
  • Does a customer have many orders, or does an order have many customers?
  • Does a car have many showrooms, or does a showroom have many cars?
  • Does a student have many courses, or does a course have many students?

Step 4: Create a Diagram

Schema Diagram

Step 5: Joining Table

Many-to-Many 関係かんけい場合ばあいJoining Table関連表かんれんひょう)を作成さくせいする必要ひつようがある。

れい:Student と Class の関係かんけい

あやまった方法ほうほう

Student Class Wrong

ただしい方法ほうほう

Student Class Correct

ER Diagram:

Student Class ER

Normalization

正規化せいきか資料データをテーブルに整理せいりするプロセスで、資料冗餘データじょうちょう減少げんしょうし、資料完整性データかんぜんせい確保かくほする。

1NF (First Normal Form)

第一正規化だいいちせいきか重複値ちょうふくち除去じょきょ

  1. Does the combination of all columns make a unique row every single time?
  2. What field can be used to uniquely identify the row?
1NF Example

2NF (Second Normal Form)

第二正規化だいにせいきか部分相依ぶぶんそうい除去じょきょ / 主鍵しゅけん一部いちぶにのみ依存いぞんする欄位フィールド除去じょきょ

  1. Fulfil the requirements of first normal form
  2. Each non-key attribute must be functionally dependent on the primary key

欄位フィールド主鍵しゅけん依存いぞんするかを判断はんだん

欄位フィールドPK に依存いぞん説明せつめい
student nameYesことなる学生がくせい ID はことなる学生名がくせいめいあらわ
fees paidYesかく費用値ひようち単一たんいつ学生がくせい対応たいおう
date of birthYes生年月日せいねんがっぴはその学生がくせい特有とくゆう
addressYes住所じゅうしょはその学生がくせい特有とくゆう
subject 1~4Noひとつの科目かもく複数ふくすう学生がくせい登録とうろくできる
teacher nameNo教師名きょうしめいはこの学生がくせい依存いぞんしない
teacher addressNo教師きょうし住所じゅうしょはこの学生がくせい依存いぞんしない
course nameNo課程名かていめい学生がくせい依存いぞんしない

主鍵しゅけん依存いぞんしない欄位フィールドあたらしいテーブルに移動いどう

  • Subject (subject ID, subject name)
  • Teacher (teacher ID, teacher name, address)
  • Course (course ID, course name)
  • Student (student ID, student name, fees paid, date of birth, address)

Foreign Keys in Tables

自問じもん

  • Does a course have many students, or does a student have many courses?
  • Does a teacher have many courses, or does a course have many teachers?
  • Does a subject have many students, or does a student have many subjects?

2NF 結果けっか

2NF Result

3NF (Third Normal Form)

第三正規化だいさんせいきか間接相依かんせつそうい除去じょきょ / 主鍵以外しゅけんいがい相依関係そういかんけいのある欄位フィールド除去じょきょ

Every attribute that is not the primary key must depend on the primary key and the primary key only.

Transitive Functional Dependency(遞移すいい函数かんすう相依そうい):

  • Column A determines column B
  • Column B determines column C
  • Therefore, column A determines C

住所じゅうしょれいに:

address
3 Main Street, North Boston 56125
16 Leeds Road, South Boston 56128

ZIP codecitystatesuburb決定けっていする。 Studentaddress ZIP code決定けっていし、さらに suburb決定けっていする。

分割結果ぶんかつけっか

  • Address Code (address code ID, ZIP code, suburb, city, state)
  • Student Table → (student ID, course ID, student name, fees paid, date of birth, street address, address code ID)
  • Teacher Table → (teacher ID, teacher name, street address, address code ID)
ほとんどの資料庫データベース正規化せいきかでは、第三正規化だいさんせいきか十分じゅうぶん

3NF ER Diagram:

3NF Result

4NF & BCNF

  • 4NF多値相依たちそうい(Multi-valued Dependency)を処理しょり
  • BCNF (Boyce-Codd Normal Form)複合主鍵ふくごうしゅけんはすべて外鍵がいけんである必要ひつようがある

MongoDB Schema Design

Design Rules

Rule 1: みを優先ゆうせんし、やむをない理由りゆうがないかぎりそうする。
Rule 2: JOIN をけられるならける。
Rule 3: 配列はいれつ無制限むせいげん成長せいちょうさせてはならない。
Rule 4: 個別こべつにアクセスする必要ひつようがあるオブジェクトはむべきではない。
Rule 5: 資料データのモデリングは、アプリケーションの資料データアクセスパターンに完全かんぜん依存いぞんする。

One-to-One

{
    "_id": "ObjectId('AAA')",
    "name": "Joe Karlsson",
    "company": "MongoDB",
    "twitter": "@JoeKarlsson1",
    "website": "joekarlsson.com"
}

One-to-Few (Embedding)

まれたオブジェクトを個別こべつることがほとんどない場合ばあいみモードを使用しようする。関連数量かんれんすうりょう通常つうじょう 1000 以内いない

{
    "_id": "ObjectId('AAA')",
    "name": "Joe Karlsson",
    "addresses": [
        { "street": "123 Sesame St", "city": "Anytown", "cc": "USA" },
        { "street": "123 Avenue Q",  "city": "New York", "cc": "USA" }
    ]
}

One-to-Many (Child-Referencing)

れい電商でんしょうサイトの商品しょうひんページ、ひとつの商品しょうひん複数ふくすう部品ぶひん構成こうせいされる。

Products Collection:

{
    "name": "left-handed smoke shifter",
    "manufacturer": "Acme Corp",
    "parts": ["ObjectID('AAAA')", "ObjectID('BBBB')", "ObjectID('CCCC')"]
}

Parts Collection:

{
    "_id": "ObjectID('AAAA')",
    "partno": "123-aff-456",
    "name": "#4 grommet",
    "qty": "94",
    "cost": "0.94",
    "price": "3.99"
}

One-to-Squillions (Parent-Referencing)

時間じかんとともに資料量データりょう成長せいちょうする場面ばめんてきしている(システムログ、取引とりひきログなど)。

Host Collection:

{
    "_id": "ObjectID('AAAB')",
    "name": "goofy.example.com",
    "ipaddr": "127.66.66.66"
}

Log Collection:

{
    "time": "ISODate('2014-03-28T09:42:41.382Z')",
    "message": "cpu is on fire!",
    "host": "ObjectID('AAAB')"
}

Many-to-Many

れい:To-Do App、一人ひとりのユーザーが複数ふくすうのタスクをち、ひとつのタスクが複数ふくすうのユーザーにてられる。

Users Collection:

{
    "_id": "ObjectID('AAF1')",
    "name": "Kate Monster",
    "tasks": ["ObjectID('ADF9')", "ObjectID('AE02')", "ObjectID('AE73')"]
}

Tasks Collection:

{
    "_id": "ObjectID('ADF9')",
    "description": "Write blog post about MongoDB schema design",
    "due_date": "ISODate('2014-04-01')",
    "owners": ["ObjectID('AAF1')", "ObjectID('BB3G')"]
}