Using database views for performance wins in Rails
Bài đăng này đã không được cập nhật trong 8 năm
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###
All rights reserved