2012-11-06 38 views
5

Thông thường để tạo/thay đổi bảng trong cơ sở dữ liệu tôi sử dụng di chuyển (chạy thủ công rake db:migrate) và sau đó trong mã của tôi, tôi sử dụng ActiveRecord. Điều này rất tuyệt vì tôi không phải lo lắng về việc biểu diễn dữ liệu trong db và về một loại db cụ thể (sqlserver, pg hoặc khác). Nhưng bây giờ một khách hàng muốn có thể tự tạo ra "thứ", ví dụ như, anh ta bắt đầu bán máy tính, vì vậy anh ta muốn một giao diện nơi anh ta có thể tự động tạo một đối tượng "máy tính" với các thuộc tính như "." Tên, RAM, HD, ... ". Nó có vẻ là khá tự nhiên để tạo ra một bảng riêng biệt trong db với tất cả các lĩnh vực này. Nhưng làm thế nào tôi có thể làm điều đó trong RoR và giữ tất cả những điều tốt đẹp về ActiveRecord?đường ray tạo bảng trong db động

Vui lòng đề xuất.

Trả lời

2

Cách thông thường là để làm hoàn toàn ngược lại:

  • Có một bảng với nhiều loại đối tượng
  • Có một bảng cho tên trường đối với từng loại đối tượng
  • Có một bảng rất lớn với tất cả các thuộc tính tùy chỉnh cho từng đối tượng thuộc bất kỳ loại nào

Đây được gọi là EAV (Mô hình thuộc tính-giá trị, xem http://en.wikipedia.org/wiki/Entity-attribute-value_model). Và nó có quy mô khá tệ. Ngoài ra, bạn có thể sử dụng cột văn bản store thay vì bảng EAV lớn (xem http://api.rubyonrails.org/classes/ActiveRecord/Store.html) để bạn không phải thực hiện những lần truy lục thuộc tính khó, điển hình của EAV. Bạn vẫn cần phải lưu trữ một nơi nào đó các định nghĩa "loại đối tượng", do đó, các trường dự kiến, v.v. có sẵn khi tạo biểu mẫu và bảng.

Vấn đề với cách tiếp cận này là bạn không thể truy vấn (ở đâu/tham gia/chọn) trên các thuộc tính đó bởi vì chúng không phải là cột. Có một số giải pháp để rằng:

  • Đừng làm lọc trên những thuộc tính (meh ...)
  • Có một máy chủ tìm kiếm bên ngoài đó là có thể làm tìm kiếm mặt
  • (như @Amar nói đúng) Sử dụng cơ sở dữ liệu tài liệu
  • Sử dụng postgreSQL và sử dụng hstore thay vì cột được tuần tự hóa đơn giản.
+0

đồng ý với @rewritten và nếu bạn muốn có thêm ví dụ, hãy xem "đầu máy CMS" (http://locomotivecms.com/), chúng gần như giống như những gì bạn đang cố gắng làm ở đây :) – sameera207

+0

@ sameera207 nhờ liên kết ví dụ (sử dụng Mongo làm cơ sở dữ liệu). Nếu bạn muốn xem triển khai EAV thú vị, hãy kiểm tra SpreeCommerce: https://github.com/spree/spree – rewritten

+0

cảm ơn chắc chắn sẽ có giao diện;) – sameera207

1

Cơ sở dữ liệu NoSQL (Cơ sở dữ liệu tài liệu Mongodb, CouchDB) có thể phù hợp nhất cho việc này hoặc sử dụng redis. Theo suy nghĩ của tôi bạn có thể sử dụng Vertical Table concept Cố gắng chạy Rails 2.x Demo of application cho MySQL. Bạn có thể thử với Mongodb, kiểm tra xem điều này là cần thiết.

+0

không biết tại sao họ cung cấp cho bạn -1 :) thnx cho câu trả lời – xaxa

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