Object Relational Mapping ( ORM ) เป็นกระบวนการ Mapping ระหว่าง Object กับ Relational Database ทำให้เราไม่ต้องไปยุ่งกับการเขียน Query ด้วยภาษา SQL เพียงแต่ต้องสร้าง Entity Class ของ Schema ใน Database เพื่อเป็นการ Mapping แบบ Object-Oriented Programming ( OOP )
Traditional vs ORM
โดยปกติเราจะเขียนภาษา SQL ในการ Query Database หากใช้ Laravel ที่เป็น MVC ซึ่งจะยัดอยู่ใน Controller
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* Show a list of all of the application's users.
*
* @return Response
*/
public function index()
{
$users = DB::table('users')->get();
return view('user.index', ['users' => $users]);
}
}
แต่ถ้าเราใช้ ORM บน Laravel จะเรียกว่า Eloquent ORM ซึ่งจะยัดอยู่ใน Model แต่จะถูกเรียกด้วย Controller อีกที
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'my_flights';
}
.NET Core ORM
บน .NET Core ก็มี .NET Core ORM อยู่หลายตัว แต่ที่นิยมใช้กันก็คือ Entity Framework Core, NHibernate และ Dapper ซึ่งจะช่วยลดความซับซ้อนในการเขียน Query ที่ใช้การ Join หลาย Table รวมถึงกรณีที่มีการแก้ไข Database Structure และ Database Relational จะต้องมาแก้ไข Query ตามไปด้วย ทุกหน้าที่มีการเขียน Query เพื่อดึงข้อมูลจาก Database โดยการ Mapping ORM จะแบ่งออกเป็น 2 แบบ
- Code-First : กรณีที่ยังไม่มี Database ให้ทำการสร้างคลาส POCO Entities ซึ่งเป็นคลาสพื้นฐานที่ไม่ขึ้นกับ Framework เหมือนกับคลาสของ .NET CLR แล้วทำการ Generate Database จาก Class ที่สร้าง
- Database-First : กรณีที่มี Database อยู่แล้ว ให้ทำการ Generate Class จาก Schema ใน Database
Pros
- ลดปัญหา Redundancy Query ที่ซ้ำกัน
- ลดปัญหา Security ที่เกิดจาก SQL Injection
- ลดข้อผิดพลาดจากการ Query Database
- การเปลี่ยนแปลง Database Structure ไม่จำเป็นต้อง Rewrite Code
- การย้ายฐานข้อมูล RDBMS ไปยังฐานข้อมูลตัวอื่น ทำได้ทันที
- การสร้าง Model เป็นแบบ OOP ทำให้ได้คุณสมบัติของ OOP มาด้วย
- การทำ Unit Test สามารถทำได้สะดวกมากยิ่งขึ้น
- หากต้องการ Performance ยังสามารถเขียน SQL Query ที่ซับซ้อนได้
Cons
- ทำความเข้าใจยากเนื่องจาก Database Layer มันเป็น Abstract และต้องเสียเวลาในการทำความเข้าใจในเรื่องนี้อยู่พอสมควรเนื่องจากมันมี Learning Curve ที่สูง ที่หลายคนอาจมองว่าง่าย แต่ถ้าเกิดติดปัญหาจากการสร้าง Model แบบ Database First ก็จะชวนปวดหัวอยู่ไม่น้อย
- ต้องเข้าใจเทคนิคการเขียนโปรแกรมแบบ Dependency Injection ( DI ) โดยที่ Service หนึ่งต้องพึงพาอีก Service หนึ่ง ( Depend on ) โดยการเรียกใช้ Service นั้นผ่าน Constructor โดยที่ไม่ต้องทำการประกาศ Object ขึ้นมาใหม่ แต่เป็นการส่งค่าแบบ Parameter
- ปัญหาด้าน Performance สมมุติว่ามีตาราง User และ Role โดยแต่ละ User มีความสัมพันธ์กับ Role มากกว่า 1 แบบ One-to-Many ซึ่งเราต้องทำการหา User จากตารางแรกก่อน แล้วทำการหา Role โดยการวนลูป จะมี Big O notation เท่ากับ N + 1 ซึ่งแก้ไขได้โดย Eager Loading คือทำการหาทั้งสอง Table พร้อมกันเหมือนการ Join
อ่านเพิ่มเติม : https://bit.ly/2sslb6b, https://bit.ly/2QobOMB
Leave a Reply