2010-06-16 14 views
12

Cho bạn phải thực hiện một nguồn cấp dữ liệu tin tức như một trong các mạng xã hội, ex facebook. Hiện tại tôi đang sử dụng một lớp Tin tức có sự phân bổ đa hình có thể thuộc bất kỳ hình thức nào như Hình ảnh, Nhận xét, Tình bạn, GroupMembership, v.v. Bất cứ khi nào một đối tượng được tạo ra, vì News cũng được tạo ra. Nó hoạt động tốt với AR (ActiveRecords) nhưng tôi gặp rắc rối khi tôi chuyển sang DM (DataMapper) hoặc Sequel vì cả hai đều không hỗ trợ các liên kết đa hình và ngăn cản việc sử dụng nó.làm thế nào để tránh các mối liên hệ đa hình

Một cách giải quyết khác là sử dụng mệnh đề SQL lớn với nhiều UNIONs để hợp nhất tất cả các bảng khác nhau cần được xem là tin tức. Nhưng điều này có một số nhược điểm, hiệu suất escpecially sẽ là khủng khiếp. Vì vậy, tôi tự hỏi làm thế nào để giải quyết mà không có các hiệp hội đa hình trong khi vẫn nhận được hiệu suất tốt và không có những hạn chế khác, như có khả năng thêm dữ liệu meta vào một tin tức không? Không, không.

Trả lời

21

Tuyên bố từ chối trách nhiệm: Tôi là nhà phát triển chính của Sequel.

Cách tốt nhất để đi về nó thường phụ thuộc vào loại điều bạn muốn làm với dữ liệu. Một cách để đi về nó là phải có cột chính nước ngoài cho tất cả các mối quan hệ tốt:

news: 
    id 
    ... (Other columns) 
    image_id 
    comment_id 
    friendship_id 
    group_membership_id 

Thật sự không có khác biệt hiệu suất trong làm việc theo cách này so với việc có một khóa ngoại chung và lưu trữ một tên lớp. Để tải chậm, bạn chỉ cần chọn một trường khóa ngoài không phải là nil/NULL và chọn liên kết phù hợp để tải. Đối với tải truy vấn mỗi bảng mong muốn, bạn chỉ cần tải tất cả các liên kết cùng một lúc. Điều này cũng linh hoạt hơn ở chỗ bạn có thể háo hức tải bằng cách sử dụng JOIN, điều không thể thực hiện được với phương pháp đa hình. Thêm vào đó, bạn nhận được lợi ích của tính toàn vẹn tham chiếu thực sự.

Nhược điểm duy nhất là nếu bạn muốn thêm các loại liên kết khác trong tương lai, bạn cần thêm các khóa ngoài vào bảng.

+0

Cảm ơn ... đó là một ý tưởng thực sự đơn giản nhưng tốt :-). Nó đòi hỏi một số thay đổi đối với mô hình (trả về liên kết thực sự của ref) nhưng điều đó sẽ là ok :) – gucki

+0

Tôi không thực sự nghĩ rằng đây là giải pháp. Nó không thực sự mô tả khái niệm về ví dụ một 'có thể đánh giá' có thể là một' Doanh nghiệp' hoặc một 'Người' hoặc một' Mục'. Ngay cả khi bạn có mỗi 'business_id',' person_id', 'item_id' trong bảng' Review', bạn phải tìm trường phi nil đầu tiên trong số tất cả chúng để thực sự biết được đánh giá đang trỏ đến. Còn trường hợp một hiệp hội cụ thể có thể là một trong nhiều điều khác nhau thì sao? – fatuhoku

2

Dưới đây là một viên ngọc để duy trì tính toàn vẹn tham chiếu của Hiệp hội đa hình ở cấp cơ sở dữ liệu trong Rails:

https://github.com/mkraft/fides

Như niêm yết này có adapter cho SQLite3 và PostgreSQL.

Tuyên bố từ chối trách nhiệm: Tôi đã viết đá quý.

Các vấn đề liên quan