SQLデータベースのモデリング:データ指向設計

8750 ワード

によるデータ

導入


Hi, it me


エンティティ関係モデリングを使用してより良いデータベースをモデリングする私のシリーズの最初の投稿にようこそ.このポストはデータベースを設計する方法を変えることができる関係データベースの文脈のデータ指向設計への高いレベルの概観です.オブジェクト指向設計モデルの代わりに、多くのプログラマーは使用されます.そして、それはデータと機能の両方を一つのオブジェクトにカプセル化することを意味するかもしれません、データ指向のデザインモデルは別々の実体としてデータと機能を考慮します.
このデザインメソッドはもともとゲーム開発を念頭に置いてドキュメント化されていましたが、その目標と実装はSQLの仕組みに密接に関連しています.これは、オブジェクト指向のアプローチがより悪いか時代遅れであるということではありません.

データ指向対オブジェクト指向


It's showdown time


つのアプローチの違いをプロジェクトの例で示しましょう.

シナリオ


あなたは学校のための新しいコースの登録アプリケーションを開発する必要があります.アプリケーションのユーザーは、それぞれの役割のコースに自分自身を割り当てることができる学生や教師です.各コースは、学生のための1つの教師とスポットの限られた数を持つことができます.
これがすべてのアプローチのいくつかの違いを指摘する必要があるので、私は詳細の残りの部分を除外します.

オブジェクト指向アプローチ


オブジェクト指向のアプローチを使用すると、教師と生徒の両方の能力をカプセル化するoverarchingクラスから始まるかもしれません.たとえば、Userクラスは、システムと相互作用する子供クラスの能力を示すだけでなく、コースデータとメソッドを含むCourseクラスです.次に、Teacherクラスを作成し、Studentクラスのクラスを作成します.
コード形式( C - Chorse構文で)のようになります.
public abstract class User {
  private string _name;
  // ...other fields
  public abstract bool IsEnrolledInCourse(string courseName);
  // ...other methods
}

public class Student : User {
  private float _gpa;
  // ...other fields
  public override bool IsEnrolledInCourse(string courseName) { /* some implementation */ }
  // ...other methods
}

public class Teacher : User {
  // ...fields
  public override bool IsEnrolledInCourse(string courseName) { /* some implementation */ }
  // ...other methods
}

public class Course {
  private string _name;
  // ...other fields & methods
}

データ指向アプローチ


他方、データ指向のアプローチはUserIsEnrolledInCourse()クラスの外でTeacherの機能をリファクションするでしょう.事実上、上記のクラスのいずれかで状態を変異またはチェックするどんな関数もリファクタリングされます(したがって、StudentロジックがIsEnrolledInCourse()クラスにあるなら、それは重要でありません).ここで、リファクタリングされたコードがどのように見えるかを見てみましょう.
public static class Students {
  public static List<string> Name;
  public static List<float> Gpa;
  // ...other fields
}

public static class Teachers {
  public static List<string> Name;
  // ...other fields
}

public static class Courses {
  public static List<string> Name;
  // ...other fields
}

public static class EnrolledStudents {
  public static List<string> courseName;
  public static List<string> studentName;
}

public static class EnrolledTeachers {
  public static List<string> courseName;
  public static List<string> teacherName;
}
主な違い
オブジェクトの代わりに、
  • 、各々のクラスは、事項実体
  • の全てのデータのための参照になる
  • 、有効なデータだけが挿入されるか、または
  • 状態がデータ型で維持される必要はありません
    学生が少なくとも一つのクラスに登録されるかどうかチェックするために、学生の名前が学生オブジェクト
  • Course変数を維持する代わりに登録された学生のリストにあるかどうかチェックすることができます
  • 多形はちょうど異なる実体(それ自身のオブジェクトに分割教師と学生)を持っていて、彼らに異なる機能を適用することによって扱われます
  • SQLを使用していない場合、これはまた、SQLがデータ(表)のレコードを整理する方法に似ています!

    閉鎖思考


    私は、これがプログラミングがどのように接近されることができるか、そして、オブジェクト指向設計パターンが毎回完璧な解決でないという新しい展望をあなたに与えたことを望みます.機能的プログラミングを好む人にとっては、これは単にデータから機能を切り離すことであるが、データが組織化されてアクセスされるべきであることに焦点を当てているので、すべてのあまりにも身近なように見えるかもしれない.
    このことはリレーショナルデータベースへの導入をハイレベルにし,次のポストでは,エンティティ関係モデルを用いてデータ指向設計をどのように視覚的に記述できるかについて述べる.
    あなたがこれまでそれを作ったならば、あなたがデータ指向のデザインとSQLについてどのように感じるかについて、コメントで知らせてください.あなたは初心者ですし、データベースに取得をお探しですか?またはスケールでデータベースを展開し、私は完全に間違っている感じですか?私に知らせて!

    クレジットと更なる読書


    Original Article on Data-Oriented Design by Noel Llopis
    Book on Data-Oriented Design by Richard Fabian
    Data-Oriented Design in Practice: Unity DOTS

    I was inspired to write this after reading post on object relational mapping (ORM) libraries, check it out!