2008-11-06 23 views
5

Tôi muốn làm việc với các liên kết ActiveRecord được phiên bản. Ví dụ:, tôi muốn tìm đối tượng mà một đối tượng khác thuộc về một ngày trong quá khứ nhất định hoặc đối tượng thuộc về trước đó. Liệu có tồn tại một thư viện phân lớp ActiveRecord của Rails để cung cấp các quan hệ được phiên bản không? Hoặc một số thư viện Ruby khác cung cấp các quan hệ có phiên bản bền vững?Làm cách nào để đạt được các liên kết ActiveRecord được phiên bản?

Trả lời

1

Hỗ trợ trạng thái lịch sử trong ứng dụng giao dịch là một cách tốt để mở rộng ồ ạt sự phức tạp, làm chậm hiệu suất DB và khiến cuộc sống trở nên khó khăn cho bản thân bạn. Nếu bạn chỉ cần hiển thị hoặc báo cáo về trạng thái lịch sử và không cần đến từng phút, hãy xem xét xây dựng một lược đồ sao với Type-II slowly changing dimensions và một quá trình định kỳ cập nhật nó.

Điều này sẽ ít phức tạp hơn nhiều so với việc xây dựng một ứng dụng có theo dõi lịch sử đặc biệt theo hệ thống chạy qua cơ sở mã. Nếu cách tiếp cận này sẽ làm những gì bạn yêu cầu của ứng dụng, bạn có thể sẽ làm tốt hơn. Nó cũng có nghĩa là cơ sở dữ liệu ứng dụng sẽ chơi độc đáo với các cơ chế truy cập cơ sở dữ liệu vanilla đi kèm với hệ thống.

Nếu bạn cần làm mới hợp lý thường xuyên, bạn có thể triển khai hệ thống chụp dữ liệu đã thay đổi trên cơ sở dữ liệu, điều này tương đối đơn giản nếu ứng dụng chỉ phải quan tâm đến trạng thái hiện tại. Với cơ chế CDC, quá trình tải chỉ phải cập nhật dựa trên các thay đổi và sẽ chạy tương đối nhanh.

2

Miễn là bạn đang phải đối phó với một lượng lớn dữ liệu, và kích thước dương phụ sẽ không đẩy db của bạn trên mép, không có nhược điểm lớn đối với dữ liệu phiên bản lịch sử. Sự phức tạp của truy vấn phụ có thể là một cơn đau nhẹ, nhưng nó không có gì lớn.

Trong trường hợp của tôi, tôi đã viết một plugin ray để xử lý phiên bản, nó bổ sung thêm 5 cột cho mỗi bảng là phiên bản (và giúp xử lý truy vấn/thao tác vv):

valid_from - datetime - datetime rằng phiên bản này là tạo tại

valid_to - datetime - datetime rằng phiên bản này không còn là hợp lệ

root_id - nguyên - id của bản gốc hàng (rằng đây là một phiên bản tiếp theo của)

created_by - nguyên - Các user id của người sử dụng mà thực hiện việc tạo ra các phiên bản này

retired_by - nguyên - Các user id của người sử dụng mà đã gỡ bỏ phiên bản này

Đối với các hàng hiện đang hoạt động, valid_to là null. Thêm một chỉ mục trên valid_to viện trợ trong việc giữ hiệu suất linh hoạt.

+0

Không đồng ý với 'nhẹ'. Trên một hệ thống bảo hiểm bảo lãnh tôi hơi quen thuộc với các ước tính là theo dõi lịch sử được thêm vào trong một phiên bản cụ thể chiếm khoảng 70% nỗ lực phát triển. – ConcernedOfTunbridgeWells

+0

Thú vị, trải nghiệm cá nhân của tôi sẽ thay đổi theo cách khác, nhưng tôi đã thiết kế hệ thống để được phiên bản từ đầu. Tôi không muốn tưởng tượng nỗi đau nó sẽ mất để thêm nó trong một phiên bản sau này. Hệ thống có khoảng 20 bảng được phiên bản, 10 bảng không phiên bản. – Michael

+1

Hm, điều này nghe rất thú vị! Bạn đã phát hành plugin của mình ở đâu đó?Bạn có thể tải nó lên github không? Tôi rất muốn nhìn vào nó để có được một số ý tưởng, v.v. – reto

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