JSONB với lập chỉ mục so với hstore


28

Tôi đang cố gắng quyết định thiết kế cơ sở dữ liệu, với càng ít giả định (liên quan đến cách ứng dụng web thực sự phát triển) càng tốt ở giai đoạn này.

Bước đầu tiên, hiểu rằng THAM GIA rất tốn kém, tôi đang xem xét một số lượng nhỏ các bảng nguyên khối trái ngược với một số lượng lớn các bảng nhỏ hơn được chuẩn hóa. Như một điểm thứ hai, tôi nhầm lẫn giữa việc sử dụng hstore so với các bảng thông thường so với JSONB (với lập chỉ mục GiST).

AFAIK (xin vui lòng sửa):

  1. Nói chung, trong Postgres, hstore được biết là hoạt động tốt hơn các loại dữ liệu khác. Bài thuyết trình này từ FOSDEM PGDAY có một số thống kê thú vị (trong nửa sau của các slide). https://wiki.postgresql.org/images/b/b4/Pg-as-nosql-pgday-fosdem-2013.pdf

  2. Một lợi thế với hstore là lập chỉ mục nhanh (GiN hoặc GiST). Tuy nhiên, với JSONB, lập chỉ mục GiN và GiST cũng có thể được áp dụng cho dữ liệu JSON.

  3. Blog này từ một chuyên gia tại 2nd Quadrant cho biết "Tại thời điểm này, có lẽ nên thay thế việc sử dụng hstore bằng jsonb trong tất cả các ứng dụng mới" (cuộn đến cuối): http://blog.2ndquadrant.com/postgresql-anti-potypes-unn cần thiết -jsonhstore-Dynamic-cột /

Vì vậy, tôi muốn quyết định như sau:

  1. Đối với phần chính (có cấu trúc) của dữ liệu: nó có nên đi vào một vài bảng quan hệ (tương đối lớn với nhiều cột) hay nên là một số cửa hàng khóa-giá trị sử dụng hstore?
  2. Đối với dữ liệu ad hoc (do người dùng đóng góp / không có cấu trúc), dữ liệu đó có phải trong kho lưu trữ giá trị khóa JSON hoặc ad hoc trong hstore (với các khóa được lưu trữ trong một trong các bảng quan hệ chính) không?

7
Tham gia không đắt tiền. Ai nói điều đó với bạn? Về cơ bản, toàn bộ khái niệm về cơ sở dữ liệu quan hệ xoay quanh các phép nối (theo quan điểm thực tế), các sản phẩm này rất tốt khi tham gia. Cách suy nghĩ thông thường là bắt đầu với các cấu trúc được chuẩn hóa đúng cách và đi vào sự không chuẩn hóa lạ mắt và những thứ tương tự khi hiệu suất thực sự cần nó ở phía đọc. JSON(B)hstore(và EAV) là tốt cho dữ liệu có cấu trúc không xác định.
dezso

6
@Yogesch những liên kết đó chứa một số nội dung thú vị và mâu thuẫn nhau :) Về mặt đạo đức, có vẻ như MySQL rất tệ khi tham gia và mọi người NoQuery có xu hướng khái quát khái niệm này mà không có bất kỳ cơ sở thực tế nào. Mặt khác, Aaron và Max rất nhạy cảm với từ p đó - cách sử dụng rộng rãi của nó cho thấy cách những người không phải người bản xứ (bao gồm cả tôi) sử dụng một cách vui vẻ từ sai.
dezso

4
@Yogesch một cách thực tế Tôi chắc chắn có một nguồn trên Internet để "chứng minh" bất cứ điều gì, giống như bất kỳ văn bản tôn giáo nào cũng có thể được sử dụng để biện minh cho sự tàn bạo (như được thể hiện rõ nét trong lịch sử). Đúng là bạn càng làm ít việc thì càng tốn ít chi phí, nhưng luôn có sự đánh đổi .
Erik

4
@Yogesch: Tránh tham gia rất quan trọng đối với các hoạt động đọc nặng, nơi bạn biết trước mẫu truy cập dữ liệu và do đó bạn có thể đặt tất cả dữ liệu bạn cần vào một hàng một cách an toàn. Tuy nhiên, điều này làm cho các tham gia khác có khả năng tốn kém hơn. Ai sẽ nói bạn sẽ không cần tham gia dữ liệu theo nhiều cách khác nhau để trả lời các câu hỏi khác nhau? Bây giờ chúng ta sẽ đơn giản đi vào lý thuyết về mô hình hóa dữ liệu quan hệ ...
Chris

5
@Yogesch Trong thực tế của tôi, với cơ sở dữ liệu, nút cổ chai hiếm khi là RAM hoặc CPU nhưng đó là I / O - cách này để tránh lưu trữ dữ liệu dư thừa vẫn là một điều quan trọng. Như Chris nói, nếu bạn luôn nhìn thấy dữ liệu của mình chỉ bằng một cách, điều này có thể đáng giá. Nếu không, bạn đang ở đó với một khối dữ liệu cồng kềnh và rất không linh hoạt.
dezso

Câu trả lời:


41

Cơ sở dữ liệu quan hệ được thiết kế xung quanh các phép nối và được tối ưu hóa để thực hiện chúng tốt.

Trừ khi bạn có lý do chính đáng để không sử dụng thiết kế chuẩn hóa, hãy sử dụng thiết kế chuẩn hóa.

jsonbvà những thứ như hstorelà tốt khi bạn không thể sử dụng mô hình dữ liệu được chuẩn hóa, chẳng hạn như khi mô hình dữ liệu thay đổi nhanh chóng và được người dùng xác định.

Nếu bạn có thể mô hình hóa nó một cách tương đối, mô hình hóa nó một cách tương đối. Nếu bạn không thể, hãy xem xét json, v.v ... Nếu bạn chọn giữa json / jsonb / hstore, thường chọn jsonb trừ khi bạn có lý do để không.

Đó là những gì tôi đã nói trong bài viết trên blog của mình , chỉ đề cập đến chủ đề này. Xin vui lòng đọc toàn bộ bài . Đoạn bạn trích dẫn chỉ ra rằng nếu bạn chọn cấu trúc động, bạn nên chọn jsonb trên hstore, nhưng phần còn lại của bài đăng trên blog là về lý do tại sao bạn thường thích mô hình hóa một cách tương đối nếu bạn có thể.

Vì thế. Mô hình phần cấu trúc chính liên quan. Nếu các bảng thực sự rộng với nhiều cột, đây có thể là dấu hiệu cần phải chuẩn hóa thêm. Đừng sợ tham gia. Học cách yêu tham gia. Tham gia nhiều bảng nhỏ thường sẽ nhanh hơn truy vấn và duy trì các bảng không chuẩn hóa lớn. Chỉ chuẩn hóa nếu bạn cần cho các trường hợp cụ thể và tốt nhất là thông qua các quan điểm cụ thể hóa ... nhưng đừng làm điều đó cho đến khi bạn biết bạn cần và có một vấn đề cụ thể thực tế để giải quyết.

Đối với dữ liệu do người dùng đóng góp là dạng tự do và không có cấu trúc, hãy sử dụng jsonb. Nó sẽ hoạt động tốt như hstore, nhưng nó linh hoạt hơn và dễ làm việc hơn.

Một điều có liên quan để hiểu: Gist và GIN các chỉ mục như sử dụng trên jsonb nói chung là nhiều ít hiệu quả hơn so với một chỉ số b-tree đồng bằng. Chúng linh hoạt hơn, nhưng chỉ số b-cây trên một cột bình thường sẽ hầu như luôn luôn nhanh hơn nhiều.


Rất cám ơn Craig, bây giờ tôi đã hiểu rõ hơn nhiều và biết phải làm gì. Câu hỏi tiếp theo: nếu tôi đang lưu trữ thứ gì đó như lượt thích hoặc người theo dõi ở định dạng hai cột (post_id và user_id, để thích ), tốt hơn là sử dụng bảng quan hệ có hai cột hoặc kho lưu trữ? (Tôi không ngại biến điều này thành một câu hỏi mới)
Yogesch

5
@Yogesch Nghe có vẻ như một bảng tham gia m: n tiêu chuẩn không có định dạng phù hợp và ổn định. Câu hỏi phải luôn luôn là "có lý do chính đáng nào tôi không nên làm theo cách quan hệ thông thường cho trường hợp cụ thể này không?".
Craig Ringer

hstorebị phản đối Sử dụng jsonb.
nguy hiểm89

2
@ risk89 Trên thực tế, nó không chính thức bị phản đối, mặc dù tôi không nghĩ có bất kỳ lý do nào để sử dụng nó để ủng hộ jsonb nữa. Trong mọi trường hợp ... đó là loại thiếu điểm. Câu hỏi là về việc mô hình hóa quan hệ hay sử dụng kiểu dữ liệu có cấu trúc.
Craig Ringer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.