Giả sử chúng ta đang nói về mối quan hệ 1: 1 giữa tất cả các bảng.
Lưu trữ tổng thể thực tế luôn rẻ hơn (thực chất) với một bảng thay vì nhiều bảng trong mối quan hệ 1: 1. Mỗi hàng có 28 byte trên không, cộng thêm một vài byte nữa cho phần đệm thêm. Và bạn cần lưu trữ cột PK với mỗi bảng. Và có một chỉ mục (dự phòng) riêng biệt trên mỗi cột này ... Kích thước không quan trọng đối với hiệu suất.
Điều này thậm chí đúng nếu nhiều cột là NULL trong hầu hết các hàng vì lưu trữ NULL rất rẻ :
Trong khi truy xuất tất cả các cột, một bảng duy nhất nhanh hơn đáng kể so với 5 bảng được nối với nhau. Nó cũng đơn giản hơn nhiều . Năm bảng có thể khó tham gia nếu không phải tất cả các hàng đều có trong tất cả các bảng. Với các WHERE
điều kiện nhắm mục tiêu vào một bảng duy nhất, thật dễ dàng để nối thêm các bảng khác LEFT JOIN
. Không tầm thường nếu bạn có các vị từ trên nhiều bảng ...
Phân vùng dọc vẫn có thể cải thiện hiệu suất của các truy vấn nhất định. Ví dụ: nếu 90% truy vấn của bạn truy xuất cùng 5 cột trong số 65 cột có sẵn, thì điều này sẽ nhanh hơn với một bảng chỉ giữ 5 cột này.
OTOH, bạn có thể có thể phục vụ cho các truy vấn như vậy trên một vài cột được chọn với chỉ mục "bao phủ" cho phép quét chỉ mục .
Một ứng cử viên khác cho phân vùng dọc: Nếu bạn có nhiều cập nhật chỉ trên một vài cột, trong khi phần còn lại hầu như không thay đổi. Có thể rẻ hơn đáng kể để phân chia các hàng trong trường hợp như vậy, vì Postgres viết một phiên bản hàng mới cho mỗi bản cập nhật. Có các trường hợp ngoại lệ cho các giá trị lớn được lưu trữ ngoài luồng ("TOASTed"). Thêm chi tiết:
Nó thực sự phụ thuộc vào tình hình hoàn chỉnh. Nếu nghi ngờ, hãy đi với giải pháp đơn giản là có một bảng duy nhất, đặc biệt nếu nó mô tả đúng thực tế: Trong ví dụ của bạn, đó là tất cả các thuộc tính của một chiếc xe hơi và có ý nghĩa với nhau.
VehicleInterior
, các truy vấn khác mà đối phó với các cột từ chỉVehicleTechnical
, vv Hoặc nếu có nhiều hàng / xe mà hoàn toàn không có thông tin về (ví dụ)VehicleExtra
để thay vì nhiều hàng có nhiều null trong một bảng, bạn có các hàng trong phần còn lại của bảng và không có hàng nào trongVehicleExtra