2017-07-02 25 views
11

Tôi có hơn 1 tỷ bản ghi tên miền, thay vì đặt tất cả trong một bảng, tôi quyết định chia chúng thành 36 bảng (cùng một cấu trúc db cho mỗi bảng).Cách cấu trúc mô hình được chia thành cơ sở dữ liệu dưới dạng 36 bảng?

Có bảng dựa trên ký tự đầu tiên của tên miền (ví dụ: domains_a ... domains_z).

Làm cách nào để tạo một mô hình Domain trong đường ray tự động chuyển đổi giữa các bảng này một cách liền mạch dựa trên ký tự được chỉ định?

+0

Làm thế nào để sử dụng ymal? –

+4

Tại sao bạn lại chia nhỏ dữ liệu? Đây là một sai lầm trừ khi bạn có một lý do tuyệt vời. Một tỷ bản ghi không quá lớn cho ví dụ. postresql. Nó cho phép 32 bảng TB. Vì vậy, miễn là hồ sơ của bạn là 30Kb hoặc ít hơn bạn tốt để đi. MySQL cho phép nhiều bảng lớn hơn nhiều. – Gene

+2

Vui lòng chỉ định cơ sở dữ liệu bạn đang sử dụng - mọi giải pháp sẽ liên quan nhiều đến các tính năng dành riêng cho DB. –

Trả lời

2

Bạn không thể: bạn phải viết logic của riêng mình để giải quyết vấn đề đó. Rails sẽ cần biết logic nghiệp vụ của bạn và phân tích truy vấn SQL để tìm ra bảng nào cần chọn và không thể làm điều đó theo mặc định, bạn cần tự viết mã đó.

Tuy nhiên có một mẹo giúp bạn dễ dàng hơn. Điều gì về việc xử lý này ở cấp cơ sở dữ liệu? Tôi đã kiểm tra và tất cả các cơ sở dữ liệu chính hỗ trợ lượt xem có thể cập nhật.

Vì vậy, tạo ra một cái nhìn mới, đặt tên cho nó domains và chắc chắn rằng nó tạo ra một đoàn của tất cả các bảng tên miền của bạn (từ a đến z), sau đó createa mô hình:

class Domain 
    self.table_name = "your_view_name" 
end 

này sẽ làm lừa cho đọc bên. Bây giờ dựa trên cơ sở dữ liệu bạn đang sử dụng, bạn có thể giải quyết vấn đề viết theo cách này (với các trình kích hoạt và các chức năng DB tương tự), nếu không, bạn cần phải viết mã của riêng bạn cho phần viết. chạy truy vấn thô. Thay vào đó, bạn có thể giải quyết vấn đề này ở cấp độ Ruby bằng cách tạo tất cả các mô hình (DomainA, DomainB, v.v.) theo cách thủ công hoặc bằng trình tạo và sau đó tạo một lớp chung hoạt động như một giao diện. Hoặc, bạn có thể tạo ra những mô hình đó với một số lập trình meta và một lần nữa có một lớp chung làm việc như một giao diện.

3

Nói chung, loại phân đoạn bảng này được xử lý ở cấp cơ sở dữ liệu. Bạn nên chỉ định cơ sở dữ liệu nào bạn đang sử dụng, vì điều đó sẽ cực kỳ có liên quan ở đây.

Ví dụ: PostgreSQL có hỗ trợ cơ bản table partition. Bạn sẽ trỏ mô hình Rails tại bảng chính và phân vùng sẽ trong suốt với lớp Ruby.

+0

Có cách nào trong phân đoạn bảng Postgres tự động di chuyển các hàng đến phân vùng thích hợp nếu giá trị phạm vi được cập nhật không? – Jacob

0

Phân vùng bảng là cách để thực hiện. Không tạo ra tất cả những cấu trúc bảng giống hệt nhau.

phân vùng bảng Điều gì sẽ cung cấp cho bạn

  1. Bạn sẽ có bảng duy nhất mà là một cách logic phân chia bởi các cơ sở dữ liệu.
  2. Trong giao diện ứng dụng của bạn, bạn đang truy vấn một bảng đơn giống như bất kỳ bảng cơ sở dữ liệu nào khác.
  3. Trong phối cảnh cơ sở dữ liệu, nó lưu trữ dữ liệu theo phân vùng được xác định bởi kiểu phân vùng và logic phân vùng. Trong mysql, bạn có thể tham khảo https://dev.mysql.com/doc/refman/5.7/en/partitioning-types.html
  4. Lợi ích hiệu suất nếu được xác định chính xác.Nó sẽ tránh quét 1 tỷ hàng nhưng thay vì quét phân vùng liên quan khi thực hiện truy vấn.

Phân vùng bảng có thể rất cụ thể về cơ sở dữ liệu.

Ví dụ đơn giản từ mysql.

CREATE TABLE employees (
    id INT NOT NULL, 
    fname VARCHAR(30), 
    lname VARCHAR(30), 
    hired DATE NOT NULL DEFAULT '1970-01-01', 
    separated DATE NOT NULL DEFAULT '9999-12-31', 
    job_code INT NOT NULL, 
    store_id INT NOT NULL 
) 
PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (6), 
    PARTITION p1 VALUES LESS THAN (11), 
    PARTITION p2 VALUES LESS THAN (16), 
    PARTITION p3 VALUES LESS THAN MAXVALUE 
); 

Nhân viên được lưu vào phân vùng cụ thể cho p0, p1, p2 hoặc p3 tùy thuộc vào cửa hàng (store_id) mà nhân viên đó thuộc.

Bạn vẫn đang truy cập thông qua một bảng duy nhất nhưng dữ liệu được lưu trữ hợp lý theo phân vùng tùy thuộc vào store_id.

SELECT * FROM employee WHERE store_id = 10 

Cơ sở dữ liệu sẽ chỉ xem phân vùng p1 và không quét phân vùng khác (p0, p2 và p3) vì truy vấn đó sẽ không bao giờ tìm thấy dữ liệu trong phân vùng đó.

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