กลับไปหน้าบทความ

อ่าน 5 นาที

รูปแบบบันทึกที่ใช้งานอยู่

ใน วิศวกรรมซอฟต์แวร์ รูป แบบ Active Record เป็น รูปแบบสถาปัตยกรรม พบได้ในซอฟต์แวร์ที่จัดเก็บข้อมูลวัตถุในหน่วยความจำใน ฐานข้อมูลเชิงสัมพันธ์ ได้รับการตั้งชื่อโดย Martin Fowler...

รูปแบบบันทึกที่ใช้งานอยู่

ในวิศวกรรมซอฟต์แวร์รูปแบบ Active Recordเป็นรูปแบบสถาปัตยกรรมพบได้ในซอฟต์แวร์ที่จัดเก็บข้อมูลวัตถุในหน่วยความจำในฐานข้อมูลเชิงสัมพันธ์ได้รับการตั้งชื่อโดยMartin FowlerในหนังสือPatterns of Enterprise Application Architectureใน ปี 2003 [ 1 ] [ 2 ]อินเทอร์เฟซของวัตถุที่สอดคล้องกับรูปแบบนี้จะรวมถึงฟังก์ชันต่างๆ เช่น Insert, Update และ Delete รวมถึงคุณสมบัติที่สอดคล้องกับคอลัมน์ในตารางฐานข้อมูลโดยตรงหรือโดยอ้อม

รูปแบบ Active Record (Active Record) เป็นเลเยอร์การเข้าถึงข้อมูลที่ทำหน้าที่ถ่ายโอนข้อมูลแบบสองทิศทางระหว่างแหล่งเก็บข้อมูลถาวร (มักเป็นฐานข้อมูลเชิงสัมพันธ์ ) และการแสดงข้อมูลในหน่วยความจำ (เลเยอร์โดเมน) ตาราง หรือวิว ใน ฐานข้อมูลจะถูกห่อหุ้มไว้ในคลาสดังนั้น อินสแตนซ์ ของอ็อบเจ็กต์จึงผูกติดกับแถวเดียวในตาราง หลังจากสร้างอ็อบเจ็กต์แล้ว แถวใหม่จะถูกเพิ่มเข้าไปในตารางเมื่อบันทึก อ็อบเจ็กต์ใดๆ ที่โหลดเข้ามาจะได้รับข้อมูลจากฐานข้อมูล เมื่อมีการอัปเดตอ็อบเจ็กต์ แถวที่เกี่ยวข้องในตารางก็จะได้รับการอัปเดตด้วย คลาสที่ห่อหุ้มจะใช้งานเมธอดหรือคุณสมบัติในการเข้าถึงสำหรับแต่ละคอลัมน์ในตารางหรือวิว

รูปแบบนี้มักใช้ในเครื่องมือจัดเก็บข้อมูลแบบถาวร (object persistence tools) และในการแมปอ็อบเจ็กต์-รีเลชันแนล (ORM) โดยทั่วไป ความสัมพันธ์ ของคีย์ต่างประเทศจะถูกแสดงออกมาในรูปของอินสแตนซ์ของอ็อบเจ็กต์ประเภทที่เหมาะสมผ่านทางคุณสมบัติ

การนำไปใช้

การนำแนวคิดนี้ไปใช้งานสามารถพบได้ในเฟรมเวิร์ก ต่างๆ สำหรับสภาพแวดล้อมการเขียนโปรแกรมหลายประเภท ตัวอย่างเช่น หากมีตารางpartsในฐานข้อมูลที่มีคอลัมน์name(ชนิดสตริง) และprice(ชนิดตัวเลข) และมีการนำรูปแบบ Active Record ไปใช้ในคลาสPartรหัสเทียมจะเป็นดังนี้

Part part = new Part ( "ชิ้นส่วนตัวอย่าง" , 123.45 );

คำสั่ง นี้จะสร้างแถวใหม่ในpartsตารางโดยใช้ค่าที่กำหนด และโดยคร่าวๆ แล้วเทียบเท่ากับคำสั่ง SQL

INSERT INTO parts ( name , price ) VALUES ( 'Sample part' , 123 . 45 );

ในทางกลับกัน คลาสนี้สามารถใช้เพื่อสอบถามฐานข้อมูลได้:

ส่วนb = parts.stream () . filter ( p - > "gearbox" .equals ( p.getName ( ) ) ) . findFirst ( ) . orElse ( null );

คำสั่ง นี้จะค้นหาPartอ็อบเจ็กต์ใหม่โดยอิงจากแถวแรกที่ตรงกันในpartsตารางซึ่งnameคอลัมน์มีค่าเป็น "gearbox" คำสั่ง SQL ที่ใช้อาจคล้ายกับต่อไปนี้ ขึ้นอยู่กับรายละเอียดการใช้งาน SQL ของฐานข้อมูล:

SELECT * FROM parts WHERE name = 'gearbox' LIMIT 1 ; -- MySQL หรือ PostgreSQL

ไลบรารีต่างๆ ใช้เฟรมเวิร์กรูปแบบ Active Record เช่นไลบรารี POCO C++ในPoco::ActiveRecordไลบรารี[ 3 ]

ตัวอย่าง

นี่คือตัวอย่างง่ายๆ ของอ็อบเจ็กต์ Active Record Userในภาษา Javaโดยคลาสนี้Userทำหน้าที่ทั้งเป็นโมเดลและอ็อบเจ็กต์สำหรับการเข้าถึงข้อมูลและมีเมธอดต่างๆ เช่น `index.js` save(), find()`index.js` และ `index.js`delete()

แพ็คเกจorg.wikipedia.examples ;import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.PreparedStatement ; import java.sql.ResultSet ; import java.sql.SQLException ; import java.sql.Statement ;คลาสสาธารณะUser { ตัวแปรint id ; ตัวแปรstring name ; ตัวแปรstring email ;public User ( String name , String email ) { this . name = name ; this . email = email ; }public int getId () { return id ; }public void setId ( int id ) { this.id = id ; }public String getName () { return name ; }public void setName ( String name ) { this.name = name ; }public String getEmail () { return email ; }public void setEmail ( String email ) { this.email = email ; }public void save ( ) { try ( Connection conn = DriverManager.getConnection ( " jdbc : mysql ://localhost:3306/mydb" , " user " , " password " ) ) { if ( this.id == 0 ) { String sql = " INSERT INTO users ( name, email) VALUES (?, ? ) " ; try ( PreparedStatement stmt = conn.prepareStatement ( sql , Statement.RETURN_GENERATED_KEYS ) ) { stmt.setString ( 1 , this.name ) ; stmt.setString ( 2 , this.email ) ; stmt.executeUpdate ( ) ; ResultSet rs = stmt.getGeneratedKeys ( ) ; if ( rs.next ( ) ) { this.id = rs.getInt ( 1 ) ; } } } else { String sql = "UPDATE users SET name = ?, email = ? WHERE id = ?" ; try ( PreparedStatement stmt = conn . prepareStatement ( sql )) { stmt . setString ( 1 , this . name ); stmt . setString ( 2 , this . email ); stmt . setInt ( 3 , this . id ); stmt . executeUpdate (); } } } catch ( SQLException e ) { System . err . printf ( "A SQLException occurred: %s%n" , e .getMessage ()); e.printStackTrace ( ) ; } }public static User find ( int id ) { try ( Connection conn = DriverManager . getConnection ( "jdbc:mysql://localhost:3306/mydb" , "user" , "password" )) { String sql = "SELECT * FROM users WHERE id = ?" ; try ( PreparedStatement stmt = conn . prepareStatement ( sql )) { stmt . setInt ( 1 , id ); ResultSet rs = stmt . executeQuery (); if ( rs . next ()) { User user = new User ( rs . getString ( "name" ), rs . getString ( "email" )); user . setId ( rs . getInt ( "id" )); return user ; } } } catch ( SQLException e ) { System . err . printf ( "เกิด SQLException: %s%n" , e.getMessage ( ) ); e.printStackTrace ( ) ; } return null ; }public void delete ( ) { try ( Connection conn = DriverManager.getConnection ( "jdbc:mysql://localhost:3306/mydb" , " user " , " password " )) { String sql = "DELETE FROM users WHERE id = ?" ; try ( PreparedStatement stmt = conn.prepareStatement ( sql ) ) { stmt.setInt ( 1 , this.id ) ; stmt.executeUpdate ( ); } } catch ( SQLException e ) { System.err.printf ( " A SQLException occurred: % s % n " , e.getMessage ( ) ) ; e.printStackTrace ( ) ; } } }

การวิจารณ์

หลักการความรับผิดชอบเดียวและการแยกความรับผิดชอบ

อีกหนึ่งข้อวิจารณ์เกี่ยวกับรูปแบบ Active Record คือ เนื่องจากความเชื่อมโยงอย่างแน่นหนาของการโต้ตอบกับฐานข้อมูลและตรรกะของแอปพลิเคชัน ทำให้วัตถุ Active Record ไม่เป็นไปตามหลักการความรับผิดชอบเดียวและการแยกส่วนความรับผิดชอบซึ่งตรงข้ามกับสถาปัตยกรรมแบบหลายระดับ (Multitier Architecture ) ที่จัดการกับหลักการเหล่านี้ได้อย่างเหมาะสม ด้วยเหตุนี้ รูปแบบ Active Record จึงเหมาะสมที่สุดและถูกใช้บ่อยที่สุดในแอปพลิเคชันที่เรียบง่าย ซึ่งเป็นแบบฟอร์มที่อยู่เหนือข้อมูลทั้งหมด และมี ฟังก์ชัน CRUDหรือเป็นเพียงส่วนหนึ่งของสถาปัตยกรรมเท่านั้น โดยทั่วไปแล้วส่วนนั้นคือการเข้าถึงข้อมูล และนี่คือเหตุผลที่ ORM หลายตัวนำรูปแบบ Active Record มาใช้

ดูเพิ่มเติม

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Active_record_pattern&oldid=1338854499 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ รูปแบบบันทึกที่ใช้งานอยู่

ใน วิศวกรรมซอฟต์แวร์ รูป แบบ Active Record เป็น รูปแบบสถาปัตยกรรม พบได้ในซอฟต์แวร์ที่จัดเก็บข้อมูลวัตถุในหน่วยความจำใน ฐานข้อมูลเชิงสัมพันธ์ ได้รับการตั้งชื่อโดย Martin Fowler...

การนำไปใช้

การนำแนวคิดนี้ไปใช้งานสามารถพบได้ใน เฟรมเวิร์ก ต่างๆ สำหรับสภาพแวดล้อมการเขียนโปรแกรมหลายประเภท ตัวอย่างเช่น หากมีตาราง parts ในฐานข้อมูลที่มีคอลัมน์ name (ชนิดสตริง) และ price (ชนิดตัวเลข) และมีการนำรูปแบบ Active Record ไปใช้ในคลาส Part รหัสเทียมจะเป็นดังนี้

ตัวอย่าง

นี่คือตัวอย่างง่ายๆ ของอ็อบเจ็กต์ Active Record User ใน ภาษา Java โดยคลาสนี้ User ทำหน้าที่ทั้งเป็นโมเดลและ อ็อบเจ็กต์สำหรับการเข้าถึงข้อมูล และมีเมธอดต่างๆ เช่น `index.js` save() , find() `index.js` และ `index.js` delete()

หลักการความรับผิดชอบเดียวและการแยกความรับผิดชอบ

อีกหนึ่งข้อวิจารณ์เกี่ยวกับรูปแบบ Active Record คือ เนื่องจากความเชื่อมโยงอย่างแน่นหนาของการโต้ตอบกับฐานข้อมูลและตรรกะของแอปพลิเคชัน ทำให้วัตถุ Active Record ไม่เป็นไปตาม หลักการความรับผิดชอบเดียว และ การแยกส่วนความรับผิดชอบ ซึ่งตรงข้ามกับ...