Using database views for performance wins in Rails

Database views##

Một database view là tập hợp các kết quả của một truy vấn được lưu trữ mà người dùng có thể truy vấn giống như đang trong một kết nối cơ sở dữ liệu liên tục. Với rails, model thừa kế từ ActiveRecord::Base sẽ không quan tâm tới đối tượng collection tương ứng là một bảng hay view, điều này giúp cho ứng dụng có thể gọi ra những truy vấn logic vào database và khiến cho việc viết code đơn giản hơn.

class Foo < ActiveRecord::Base
  # table "foos"
end

class Bar < ActiveRecord::Base
  # view "bars"
end

Lấy một ví dụ đơn giản của Twitter đó là dịch vụ tin nhắn. Trên màn hình trang chủ của người dùng đăng nhập vào hệ thống, họ sẽ thấy một danh sách những tin từ người dùng mà họ theo dõi kèm theo nội dung của tin nhắn, thêm vào đó là tên người dùng và ảnh đại diện của người dùng đó. Giả định là tin nhắn được lưu lại vào bảng messages và thông tin người dùng lấy trong bảng users

class User < ActiveRecord::Base
  has_many :messages
End

class Follow < ActiveRecord::Base
  belongs_to :follower, class_name: "User"
  belongs_to :target, class_name: "User"
end

class Message < ActiveRecord::Base
  belongs_to :user
end

Khi bạn muốn lấy lên những tin nhắn để hiển thị đế tới người dùng đăng nhập vào hệ thống, trước hết chúng ta sẽ phải load lên những user mà người đó theo dõi, tiếp theo là tập những tin nhắn và với mỗi tin nhắn, chúng ta sẽ lấy ra user quan hệ tương ứng với tin nhắn đó để hiển thị thông tin tên và ảnh đại diện người dùng. Chúng ta có thể tạo một model mới UserMessage để lưu giữ thông tin cho mỗi tin nhắn và thông tin người dùng được hiển thị cho tin nhắn ấy

class UserMessage < ActiveRecord::Base
  self.primary_key = "message_id"
end

Chúng ta cũng cần một migration để tạo ra view tương ứng đó

CREATE VIEW user_messages AS
  SELECT u.username, u.id AS user_id, m.content, m.id AS message_id
  FROM messages m
  INNER JOIN users u ON u.id = m.user_id

Trong trường hợp này, dữ liệu có thể rất hiệu quả trong các thực hiện unions, intersections và tính toán hơn là mapping các đối tượng để thực thi cùng một hành động.

Tham khảo###

Using Rails and SQL Views for a Report

Using database views in Rails


All Rights Reserved