Mô hình dữ liệu ảnh hưởng đến khả năng mở rộng và hiệu năng đến mức nào trong cái gọi là cơ sở dữ liệu của No No.


13

Bạn không bao giờ có thể nói về cái gọi là cơ sở dữ liệu "NoQuery" mà không mang định lý CAP (Tính nhất quán, Tính khả dụng, Phân vùng: chọn hai). Nếu bạn phải chọn nói, giữa MongoDB (Phân vùng, Tính nhất quán) và CouchDB (Tính khả dụng, Phân vùng), điều đầu tiên bạn cần nghĩ đến là "Tôi có cần dữ liệu chính xác hay tôi cần truy cập mọi lúc?".

Những cơ sở dữ liệu mới đã được thực hiện để được phân vùng. Nhưng nếu tôi không ? Điều gì sẽ xảy ra nếu tôi nghĩ thật tuyệt vời khi có Khóa / Giá trị, Cột, Tài liệu, bất kỳ cơ sở dữ liệu nào thay vì cơ sở dữ liệu quan hệ và chỉ cần tạo một phiên bản máy chủ và không bao giờ hủy bỏ nó? Trong trường hợp đó, liệu tôi có sẵn sàng và nhất quán không? MongoDB sẽ không cần sao chép bất cứ thứ gì, vì vậy nó sẽ có sẵn. Và CouchDB sẽ chỉ có một nguồn dữ liệu, vì vậy nó sẽ khá nhất quán.

Vậy điều đó có nghĩa là, trong trường hợp đó, MongoDB và CouchDB sẽ có ít sự khác biệt về thời hạn sử dụng? Chà, ngoại trừ hiệu suất khóa học, API và al, nhưng điều đó sẽ giống như lựa chọn giữa PostgreQuery và MySQL hơn là có hai yêu cầu cơ bản khác nhau.

Tôi có ở đây không? Tôi có thể thay đổi cơ sở dữ liệu AP hoặc CP thành AC không bằng cách tạo nhiều hơn một thể hiện không? Hoặc có một cái gì đó mà tôi đang thiếu?

Hãy đặt câu hỏi ngược lại. Điều gì sẽ xảy ra nếu tôi lấy một cơ sở dữ liệu quan hệ, giả sử MySQL và đặt nó trong cấu hình chính / nô lệ. Tôi không sử dụng các giao dịch ACID Nếu tôi yêu cầu bất kỳ ghi nào được đồng bộ hóa với nô lệ ngay lập tức, liệu đó có phải là cơ sở dữ liệu CP không? Và điều gì xảy ra nếu tôi đồng bộ hóa nó với một số khoảng thời gian được xác định trước và không thành vấn đề nếu khách hàng đọc dữ liệu cũ từ một nô lệ. Nó sẽ không làm cho nó một cơ sở dữ liệu AP? Điều đó có nghĩa là nếu tôi từ bỏ tuân thủ ACID, tôi vẫn có thể sử dụng mô hình quan hệ cho cơ sở dữ liệu chia tay?

Về bản chất: khả năng mở rộng về những gì bạn đã sẵn sàng từ bỏ trong định lý CAP, nhiều hơn mô hình dữ liệu cơ bản? Có Cột, Tài liệu, Giá trị khóa, bất cứ điều gì giúp tăng khả năng mở rộng so với mô hình quan hệ không? Chúng ta có thể thiết kế một cơ sở dữ liệu quan hệ được thiết kế từ đầu để dung sai phân vùng không? (Có lẽ nó đã tồn tại). Chúng tôi có thể làm cho cơ sở dữ liệu NoQuery tuân thủ ACID không?

Xin lỗi, rất nhiều câu hỏi, nhưng tôi đã đọc rất nhiều về cơ sở dữ liệu NoQuery gần đây và dường như lợi ích lớn nhất của việc sử dụng chúng là chúng phù hợp hơn với "hình dạng" dữ liệu của bạn, thay vì chỉ phân vùng, CAP và từ bỏ tuân thủ ACID. Rốt cuộc, không phải ai cũng có nhiều dữ liệu đến mức họ cần phân vùng nó. Có lợi ích về hiệu suất / khả năng mở rộng khi không sử dụng mô hình quan hệ trước khi tôi nghĩ đến việc phân vùng dữ liệu của mình không?

Câu trả lời:


8

Việc sử dụng cơ sở dữ liệu NoQuery có giúp tăng khả năng mở rộng ngay cả khi bạn không bảo vệ dữ liệu? Vâng cho phép xác định khả năng mở rộng. Nếu bạn đang đề cập đến khả năng mở rộng vì các hệ thống cơ sở dữ liệu / phụ trợ có liên quan, trong đó bạn có tỷ lệ dọc và ngang trong đó tỷ lệ ngang IS đang che chở dữ liệu thì đây sẽ là một câu hỏi nhỏ vì câu trả lời sẽ hoàn toàn không có, bởi vì tùy chọn duy nhất bạn còn lại là tỷ lệ dọc (tức là có được phần cứng tốt hơn). Tuy nhiên, nếu bạn đang nói về khả năng mở rộng theo nghĩa rộng hơn đề cập đến tính linh hoạt của ứng dụng, giá trị dữ liệu, v.v ... thì đó là một câu hỏi hoàn toàn khác với một số câu trả lời. Và giống như bạn đã đề cập, nó sẽ thường đi đến những gì bạn đang làm với dữ liệu và cách lưu trữ dữ liệu. Hãy để tôi mở đầu mọi thứ ở đây với tuyên bố rằng trong hầu hết các trường hợp, bạn vẫn nên sử dụng RDBMS và NoQuery sẽ lấp đầy chỗ trống. Sau đây là mô tả về một trường hợp cụ thể trong đó cơ sở dữ liệu NoQuery sẽ có lợi hơn khi đưa ra các yêu cầu cụ thể và nơi chúng ta có thể bỏ qua tỷ lệ ngang.

Ví dụ như ý tưởng rằng bạn đang tạo một hệ thống lưu trữ tệp đám mây tương tự như google drive, dropbox hoặc hộp nhưng thay vì sử dụng một hệ thống tệp thực tế, bạn quyết định rằng sẽ có lợi hơn cho bạn để ảo hóa hệ thống tệp. Bây giờ bạn có một vấn đề vì mô hình dữ liệu của bạn đột nhiên là cấu trúc cây sẽ không hiệu quả khủng khiếp trong RDBMS (mặc dù thực tế đó là cách mọi thứ được lập chỉ mục). Bởi vì bây giờ bạn có một bảng 3 cột với Tên, Người dùng và Phụ huynh. Người dùng là khóa ngoại đối với bảng người dùng và Parent là khóa ngoại không thể tự tham chiếu (nullable vì thư mục gốc không thể có cha mẹ). Vậy khóa chính là gì? Trong trường hợp này, nó là một khóa tổng hợp trên tất cả các cột ... Điều này đột nhiên khiến Parent trở thành kẻ thù tồi tệ nhất của chúng tôi.

Bây giờ thay vì nghĩ về cách bạn sẽ đặt nó trong một số hình thức lưu trữ tài liệu? Thay vì chống lại dữ liệu, bạn có thể làm việc với nó và lưu trữ nó dưới dạng cấu trúc cây sẽ lần lượt giảm thời gian phát triển cũng như giảm chi phí bảo trì. Nếu bạn đang giảm chi phí không cho phép một loại khả năng mở rộng khác nhau? Thêm vào đó, trong trường hợp này, bạn đang tạo ra hệ thống chính xác từ đầu, điều này sẽ giúp linh hoạt hơn cho chính ứng dụng. Hiện tại tôi đang chạy ứng dụng này trên một máy chủ duy nhất bằng MongoDB, như bạn đã giải thích mang đến cho tôi một mô hình nhất quán, có sẵn, không khác nhiều so với việc nhìn vào sự khác biệt của MySQL hoặc Postgres.

Với MongoDB ít nhất bạn có thể xác định có bao nhiêu máy chủ bạn cần liên lạc để truy vấn thành công, vì vậy, bạn có thể chuyển đổi nó thành mô hình nhất quán, có sẵn nếu bạn nói với tất cả các truy vấn để giao tiếp với tất cả các trường hợp máy chủ.

Vì vậy, tôi nghĩ rằng bạn có quyền của nó trong đó có một lợi ích lớn trong cách lưu trữ dữ liệu. Có những thứ không phù hợp với mô hình quan hệ phù hợp với các mô hình khác (như một ví dụ ngắn gọn khác, Amazon sử dụng một số dạng Cơ sở dữ liệu đồ thị cho công cụ đề xuất của họ cho các sản phẩm).

Tôi đã hiểu chính xác câu hỏi của bạn?

Chỉnh sửa: Nhiều dữ liệu sẽ làm chậm mọi thứ? Đúng. Bao nhiêu nó sẽ làm mọi thứ chậm lại? Tôi thực sự không có đủ kinh nghiệm để đưa ra một câu trả lời đầy đủ. Khóa / Giá trị: Về cơ bản là bảng tra cứu với lượng lớn dữ liệu được liên kết với khóa tra cứu. Điều này sẽ thực sự rất nhanh vì bạn chỉ có thể tìm kiếm mọi thứ bằng chìa khóa. Cột / Gia đình: Về cơ bản là một cửa hàng Khóa / Giá trị có cấu trúc hơn nhiều. Bạn chỉ có thể truy vấn dựa trên Cột và do đó, điều này cũng sẽ rất nhanh. Tài liệu: Lược đồ kiểu tổng hợp. Ở đây bạn sẽ muốn tổng hợp dữ liệu tương tự với nhau. Không chuẩn hóa là ok và dự kiến ​​cho loại cơ sở dữ liệu này. Tùy thuộc vào việc bạn đang viết hay đọc nhiều, bạn có thể sắp xếp dữ liệu của mình để dữ liệu được phân phối trên nhiều phân đoạn để phân phối ghi hoặc đọc ra (lưu ý rằng bạn có thể tạo một cách tiếp cận kết hợp tốt cho cả hai nhưng nói chung là bạn cần chọn tối ưu hóa cho cái này hay cái khác) Đồ thị: Điểm mạnh của cái này là nó có thể tạo và phá vỡ các mối quan hệ thực sự nhanh chóng. Nếu bạn có một số dữ liệu mà bạn có các mối quan hệ cần thay đổi giữa các dữ liệu (nghĩ một số dạng công cụ đề xuất) thì bạn nên sử dụng dữ liệu này.

Cách bạn lưu trữ dữ liệu trong bất kỳ cơ sở dữ liệu nào trong số này sẽ ảnh hưởng đến hiệu suất (tương tự như việc bạn lưu trữ dữ liệu không chính xác trong một số RDBMS, nó sẽ ảnh hưởng đến hiệu suất). Vì vậy, để hy vọng làm cho điều này rõ ràng hơn: Bạn cần biết hệ thống cơ sở dữ liệu nào bạn nên sử dụng cũng như cách lưu trữ dữ liệu trong hệ thống cơ sở dữ liệu đó.


Vâng, đó là loại câu trả lời tôi mong đợi. Nói một cách chính xác, tôi muốn nói đến khả năng mở rộng là khả năng cho một hệ thống xử lý số lượng tác vụ ngày càng tăng mà không bị nghẹt thở, hơn nữa đó là vấn đề về khả năng mở rộng phần cứng thuần túy (có thể đó không phải là thuật ngữ đúng). Ví dụ, Nginx có thể xử lý các yêu cầu đồng thời nhiều hơn Apache, do kiến ​​trúc dựa trên sự kiện của nó. Và vì vậy, câu hỏi được đặt ra là "Trên một máy có phần cứng cố định, việc sử dụng cơ sở dữ liệu không liên quan có cho phép tôi phục vụ nhiều người dùng hơn trước khi tôi đạt đến giới hạn không?"
Laurent Bourgault-Roy

Trong trường hợp đó, nó sẽ phụ thuộc vào hệ thống cơ sở dữ liệu bạn đang sử dụng. Ví dụ về hệ thống tệp đám mây ở trên của tôi, tôi đang sử dụng Redis để thực sự lưu trữ các tệp và chúng tự hào có thể xử lý 100.000 truy vấn / giây (vì nó được xây dựng dưới dạng lưu trữ khóa / giá trị trong bộ nhớ). Bây giờ tôi thực sự không tải thử nghiệm ứng dụng của mình để xem những gì nó thực sự có thể xử lý nhưng đó là những gì trang web Redis nói. Điều này được nói rằng hãy nhớ rằng đằng sau hậu trường dữ liệu đang được trình bày theo những cách khác nhau tùy thuộc vào loại hệ thống cơ sở dữ liệu khác nhau mà bạn sử dụng. Điền vào các hốc với db thích hợp.
harageth

1
Tôi đã chỉnh sửa phản hồi của mình vì điều đó dễ hơn là thêm nhiều bình luận.
harageth

2
+1 đây là một khởi đầu tuyệt vời tại P.SE, hy vọng bạn sẽ kiên trì một thời gian và tiếp tục thêm nội dung chất lượng như thế này!
Jimmy Hoffa

1
Hoàn hảo, với bản chỉnh sửa nó cho tôi rất nhiều cái nhìn sâu sắc. Cảm ơn bạn!
Laurent Bourgault-Roy
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.