14 điều tôi ước mình biết trước khi bắt đầu với MongoDB

Bản dịch của bài báo đã được chuẩn bị vào đêm trước khi bắt đầu khóa học "Cơ sở dữ liệu phi quan hệ".

14 điều tôi ước mình biết trước khi bắt đầu với MongoDB

Điểm nổi bật:

  • Điều cực kỳ quan trọng là phát triển một lược đồ mặc dù nó là tùy chọn trong MongoDB.
  • Tương tự như vậy, các chỉ mục phải khớp với lược đồ và các mẫu truy cập của bạn.
  • Tránh sử dụng các đối tượng lớn và mảng lớn.
  • Hãy cẩn thận với cài đặt MongoDB, đặc biệt là khi nói đến bảo mật và độ tin cậy.
  • MongoDB không có trình tối ưu hóa truy vấn nên bạn phải cẩn thận khi thực hiện các thao tác truy vấn.

Tôi đã làm việc với cơ sở dữ liệu trong một thời gian rất dài nhưng chỉ mới phát hiện ra MongoDB gần đây. Có một vài điều tôi ước mình biết trước khi bắt đầu làm việc với nó. Khi một người đã có kinh nghiệm trong một lĩnh vực nhất định, họ sẽ có những quan niệm định sẵn về cơ sở dữ liệu là gì và chúng làm gì. Với hy vọng giúp người khác dễ hiểu hơn, tôi trình bày danh sách các lỗi thường gặp.

Tạo máy chủ MongoDB mà không cần xác thực

Thật không may, MongoDB được cài đặt mà không có xác thực theo mặc định. Đối với một máy trạm được truy cập cục bộ, việc này là bình thường. Nhưng vì MongoDB là một hệ thống nhiều người dùng thích sử dụng lượng bộ nhớ lớn nên sẽ tốt hơn nếu bạn đặt nó trên một máy chủ có càng nhiều RAM càng tốt, ngay cả khi bạn chỉ sử dụng nó để phát triển. Việc cài đặt trên máy chủ qua cổng mặc định có thể gặp sự cố, đặc biệt nếu bất kỳ mã javascript nào có thể được thực thi trong yêu cầu (ví dụ: $where như một ý tưởng cho tiêm).

Có một số phương pháp xác thực, nhưng cách dễ nhất là đặt ID/mật khẩu người dùng. Hãy sử dụng ý tưởng này khi bạn nghĩ về việc xác thực ưa thích dựa trên LDAP. Khi nói đến bảo mật, MongoDB phải được cập nhật liên tục và nhật ký phải luôn được kiểm tra để phát hiện truy cập trái phép. Ví dụ: tôi muốn chọn một cổng khác làm cổng mặc định.

Đừng quên liên kết bề mặt tấn công của bạn với MongoDB

Danh sách kiểm tra bảo mật MongoDB chứa các mẹo hay để giảm nguy cơ xâm nhập mạng và rò rỉ dữ liệu. Thật dễ dàng để phủ nhận điều đó và nói rằng máy chủ phát triển không cần mức độ bảo mật cao. Tuy nhiên, mọi chuyện không đơn giản như vậy và điều này áp dụng cho tất cả các máy chủ MongoDB. Đặc biệt, nếu không có lý do thuyết phục để sử dụng mapReduce, group hoặc $ ở đâu, bạn cần vô hiệu hóa việc sử dụng mã tùy ý trong JavaScript bằng cách ghi vào tệp cấu hình javascriptEnabled:false. Vì các tệp dữ liệu không được mã hóa trong MongoDB tiêu chuẩn nên việc chạy MongoDB với Người dùng chuyên dụng, có toàn quyền truy cập vào các tệp, chỉ có quyền truy cập hạn chế vào tệp đó và khả năng sử dụng các điều khiển truy cập tệp của chính hệ điều hành.

Lỗi khi phát triển mạch

MongoDB không sử dụng lược đồ. Nhưng điều này không có nghĩa là kế hoạch này là không cần thiết. Nếu bạn chỉ muốn lưu trữ tài liệu mà không có bất kỳ mẫu nhất quán nào thì việc lưu trữ chúng có thể nhanh chóng và dễ dàng nhưng việc truy xuất chúng sau này có thể khó khăn. Damn cứng.

Bài viết kinh điển"6 quy tắc chung cho thiết kế lược đồ MongoDB" Nó đáng để đọc và các tính năng như Trình khám phá lược đồ trong công cụ Studio 3T của bên thứ ba, nó đáng được sử dụng để kiểm tra mạch thường xuyên.

Đừng quên thứ tự sắp xếp

Việc quên thứ tự sắp xếp có thể gây ra nhiều thất vọng và lãng phí thời gian hơn bất kỳ cấu hình sai nào khác. Theo mặc định MongoBD sử dụng sắp xếp nhị phân. Nhưng nó dường như không hữu ích cho bất cứ ai. Các loại nhị phân phân biệt chữ hoa chữ thường, phân biệt giọng nói, được coi là lỗi thời gây tò mò cùng với các loại hạt, caftans và ria mép xoăn vào những năm 80 của thế kỷ trước. Bây giờ việc sử dụng của họ là không thể tha thứ. Trong đời thực, "xe máy" cũng giống như "xe máy". Và “Anh” và “Anh” là cùng một nơi. Một chữ cái viết thường chỉ đơn giản là chữ hoa tương đương với chữ in hoa. Và đừng để tôi bắt đầu phân loại dấu phụ. Khi tạo cơ sở dữ liệu trong MongoDB, hãy sử dụng tính năng đối chiếu không phân biệt dấu trọng âm và đăng ký, tương ứng với ngôn ngữ và văn hóa người dùng hệ thống. Điều này sẽ làm cho việc tìm kiếm thông qua dữ liệu chuỗi dễ dàng hơn nhiều.

Tạo bộ sưu tập với các tài liệu lớn

MongoDB rất vui khi lưu trữ các tài liệu lớn lên tới 16 MB trong các bộ sưu tập và GridFS Được thiết kế cho các tài liệu lớn lớn hơn 16 MB. Nhưng chỉ vì những tài liệu lớn có thể được đặt ở đó nên việc lưu trữ chúng ở đó không phải là một ý tưởng hay. MongoDB sẽ hoạt động tốt nhất nếu bạn lưu trữ các tài liệu riêng lẻ có kích thước vài kilobyte, xử lý chúng giống như các hàng trong bảng SQL rộng. Các tài liệu lớn sẽ là nguồn gốc của các vấn đề với năng suất.

Tạo tài liệu với mảng lớn

Tài liệu có thể chứa mảng. Tốt nhất là số phần tử trong mảng không phải là số có bốn chữ số. Nếu các phần tử được thêm vào một mảng thường xuyên, nó sẽ phát triển nhanh hơn tài liệu chứa nó và sẽ cần phải được di chuyển, có nghĩa là nó sẽ cần thiết cũng cập nhật chỉ mục. Khi lập chỉ mục lại một tài liệu có mảng lớn, các chỉ mục thường sẽ bị ghi đè vì có một một kỷ lục, nơi lưu trữ chỉ mục của nó. Việc lập chỉ mục lại này cũng xảy ra khi một tài liệu được chèn hoặc xóa.

MongoDB có một thứ gọi là "hệ số lấp đầy", cung cấp chỗ cho các tài liệu phát triển để giảm thiểu vấn đề này.
Bạn có thể nghĩ rằng bạn có thể làm mà không cần lập chỉ mục mảng. Thật không may, việc thiếu chỉ mục có thể khiến bạn gặp phải những vấn đề khác. Vì tài liệu được quét từ đầu đến cuối nên việc tìm kiếm các phần tử ở cuối mảng sẽ mất nhiều thời gian hơn và hầu hết các thao tác liên quan đến tài liệu đó sẽ chậm.

Đừng quên rằng thứ tự của các giai đoạn trong một tập hợp rất quan trọng

Trong hệ thống cơ sở dữ liệu có trình tối ưu hóa truy vấn, các truy vấn bạn viết là giải thích về những gì bạn muốn nhận chứ không phải cách lấy nó. Cơ chế này hoạt động tương tự như việc gọi món trong nhà hàng: thông thường bạn chỉ cần gọi một món ăn và không đưa ra hướng dẫn chi tiết cho người nấu.

Trong MongoDB, bạn hướng dẫn người nấu ăn. Ví dụ: bạn cần đảm bảo rằng dữ liệu đi qua reduce càng sớm càng tốt trong quy trình bằng cách sử dụng $match и $projectvà việc sắp xếp chỉ xảy ra sau reducevà việc tìm kiếm diễn ra theo đúng thứ tự bạn muốn. Việc có một trình tối ưu hóa truy vấn giúp loại bỏ những công việc không cần thiết, sắp xếp các bước một cách tối ưu và chọn các kiểu tham gia có thể giúp ích cho bạn. Với MongoDB, bạn có nhiều quyền kiểm soát hơn nhưng lại phải trả giá bằng sự tiện lợi.

Công cụ như Studio 3T sẽ đơn giản hóa việc xây dựng các truy vấn tổng hợp trong MongoDB. Tính năng Trình chỉnh sửa tổng hợp cho phép bạn áp dụng các câu lệnh quy trình theo từng giai đoạn một và kiểm tra dữ liệu đầu vào và đầu ra ở từng giai đoạn để gỡ lỗi dễ dàng hơn.

Sử dụng Ghi nhanh

Không bao giờ đặt tùy chọn ghi MongoDB có tốc độ cao nhưng độ tin cậy thấp. Chế độ này "file-và-quên" có vẻ nhanh vì lệnh được trả về trước khi quá trình ghi xảy ra. Nếu hệ thống gặp sự cố trước khi dữ liệu được ghi vào đĩa, nó sẽ bị mất và rơi vào trạng thái không nhất quán. May mắn thay, MongoDB 64-bit đã kích hoạt tính năng ghi nhật ký.

Công cụ lưu trữ MMAPv1 và WiredTiger sử dụng tính năng ghi nhật ký để ngăn chặn điều này, mặc dù WiredTiger có thể khôi phục về trạng thái nhất quán cuối cùng. điểm kiểm soát, nếu việc ghi nhật ký bị vô hiệu hóa.

Việc ghi nhật ký đảm bảo rằng cơ sở dữ liệu ở trạng thái nhất quán sau khi khôi phục và giữ lại tất cả dữ liệu cho đến khi nó được ghi vào nhật ký. Tần số ghi được cấu hình bằng tham số commitIntervalMs.

Để chắc chắn về các mục nhập, hãy đảm bảo tính năng ghi nhật ký được bật trong tệp cấu hình (storage.journal.enabled)và tần suất ghi tương ứng với lượng thông tin mà bạn có thể để mất.

Sắp xếp không có chỉ mục

Khi tìm kiếm và tổng hợp thường cần phải sắp xếp dữ liệu. Hãy hy vọng rằng việc này được thực hiện ở một trong những giai đoạn cuối cùng, sau khi lọc kết quả để giảm lượng dữ liệu được sắp xếp. Và ngay cả trong trường hợp này, để sắp xếp bạn sẽ cần chỉ số. Bạn có thể sử dụng một chỉ mục đơn hoặc phức hợp.

Nếu không có chỉ mục phù hợp, MongoDB sẽ không có nó. Có giới hạn bộ nhớ là 32 MB trên tổng kích thước của tất cả tài liệu trong hoạt động sắp xếpvà nếu MongoDB đạt đến giới hạn này thì nó sẽ báo lỗi hoặc trả về tập bản ghi trống.

Tìm kiếm không hỗ trợ chỉ mục

Truy vấn tìm kiếm thực hiện chức năng tương tự như thao tác JOIN trong SQL. Để hoạt động tốt nhất, chúng cần chỉ mục giá trị của khóa được sử dụng làm khóa ngoại. Điều này không rõ ràng vì việc sử dụng không được phản ánh trong explain(). Các chỉ số này ngoài chỉ mục được viết bằng explain(), do đó được sử dụng bởi các nhà khai thác đường ống $match и $sort, khi chúng gặp nhau ở đầu đường ống. Các chỉ mục bây giờ có thể bao gồm bất kỳ giai đoạn nào đường ống tổng hợp.

Từ chối sử dụng nhiều bản cập nhật

Phương thức db.collection.update() được sử dụng để thay đổi một phần tài liệu hiện có hoặc toàn bộ tài liệu, cho đến thay thế hoàn toàn, tùy thuộc vào tham số bạn chỉ định update. Điều không rõ ràng là nó sẽ không xử lý tất cả tài liệu trong bộ sưu tập trừ khi bạn đặt tùy chọn multi để cập nhật tất cả các tài liệu đáp ứng tiêu chí yêu cầu.

Đừng quên tầm quan trọng của thứ tự các khóa trong bảng băm

Trong JSON, một đối tượng bao gồm một tập hợp không có thứ tự có kích thước bằng 0 hoặc nhiều cặp tên/giá trị, trong đó tên là một chuỗi và giá trị là một chuỗi, số, boolean, null, đối tượng hoặc mảng.

Thật không may, BSON lại chú trọng nhiều đến thứ tự khi tìm kiếm. Trong MongoDB, thứ tự các khóa trong các đối tượng tích hợp vấn đềTức là { firstname: "Phil", surname: "factor" } - điều này không giống với { { surname: "factor", firstname: "Phil" }. Nghĩa là, bạn phải lưu trữ thứ tự của các cặp tên/giá trị trong tài liệu của mình nếu bạn muốn chắc chắn tìm thấy chúng.

Đừng bối rối "Vô giá trị" и "không xác định"

Giá trị "không xác định" theo tiêu chuẩn chính thức JSON (ECMA-404 Phần 5), mặc dù nó được sử dụng trong JavaScript. Hơn nữa, đối với BSON thì nó đã lỗi thời và được chuyển đổi thành $null, đó không phải lúc nào cũng là một giải pháp tốt. Tránh sử dụng "không xác định" trong MongoDB.

Sử dụng $limit() mà không $sort()

Thông thường, khi bạn đang phát triển trong MongoDB, việc chỉ xem mẫu kết quả sẽ được trả về từ một truy vấn hoặc tổng hợp là rất hữu ích. Đối với nhiệm vụ này bạn sẽ cần $limit(), nhưng nó sẽ không bao giờ có trong mã cuối cùng trừ khi bạn sử dụng nó trước đó $sort. Cơ chế này là cần thiết vì nếu không bạn không thể đảm bảo thứ tự của kết quả và bạn sẽ không thể xem dữ liệu một cách đáng tin cậy. Ở đầu kết quả, bạn sẽ nhận được các mục khác nhau tùy thuộc vào cách sắp xếp. Để hoạt động đáng tin cậy, các truy vấn và tập hợp phải mang tính xác định, nghĩa là tạo ra kết quả giống nhau mỗi khi chúng được thực thi. Mã có chứa $limit(), nhưng không $sort, sẽ không mang tính quyết định và sau đó có thể gây ra lỗi khó theo dõi.

Kết luận

Cách duy nhất để thất vọng với MongoDB là so sánh trực tiếp nó với một loại cơ sở dữ liệu khác, chẳng hạn như DBMS hoặc bắt đầu sử dụng nó dựa trên những kỳ vọng nhất định. Nó giống như so sánh một quả cam với một cái nĩa. Hệ thống cơ sở dữ liệu phục vụ các mục đích cụ thể. Tốt nhất bạn chỉ cần hiểu và đánh giá cao những khác biệt này cho chính mình. Sẽ thật xấu hổ khi gây áp lực cho các nhà phát triển MongoDB theo con đường buộc họ phải đi theo con đường DBMS. Tôi muốn thấy những cách mới và thú vị để giải quyết các vấn đề cũ, chẳng hạn như đảm bảo tính toàn vẹn dữ liệu và tạo ra các hệ thống dữ liệu có khả năng phục hồi trước các lỗi và các cuộc tấn công độc hại.

Việc giới thiệu giao dịch ACID của MongoDB trong phiên bản 4.0 là một ví dụ điển hình về việc giới thiệu những cải tiến quan trọng theo cách đổi mới. Các giao dịch đa tài liệu và nhiều câu lệnh giờ đây mang tính nguyên tử. Cũng có thể điều chỉnh thời gian cần thiết để lấy khóa và chấm dứt các giao dịch bị mắc kẹt, cũng như thay đổi mức độ cô lập.

14 điều tôi ước mình biết trước khi bắt đầu với MongoDB

Đọc thêm:

Nguồn: www.habr.com

Thêm một lời nhận xét