Sự khác biệt giữa các thuật toán sử dụng cấu trúc dữ liệu và thuật toán sử dụng cơ sở dữ liệu là gì?


10

Câu hỏi chung

Sự khác biệt giữa các thuật toán sử dụng cấu trúc dữ liệu và thuật toán sử dụng cơ sở dữ liệu là gì?

Một số bối cảnh

Đây là một câu hỏi đã làm tôi khó chịu một thời gian và tôi không thể đưa ra câu trả lời thuyết phục cho nó.

Hiện tại, tôi đang làm việc để củng cố sự hiểu biết của mình về các thuật toán, tất nhiên, liên quan nhiều đến cấu trúc dữ liệu. Đây là các cấu trúc cơ bản như Túi, Hàng đợi, Ngăn xếp, Hàng đợi ưu tiên và Heap.

Tôi cũng sử dụng cơ sở dữ liệu hàng ngày để lưu trữ dữ liệu đã được xử lý và gửi bởi người dùng cuối hoặc được chương trình xử lý. Tôi lấy và gửi dữ liệu thông qua một DAL, có cấu trúc dữ liệu của riêng nó được tạo dựa trên các bảng trong cơ sở dữ liệu.

Câu hỏi của tôi xuất hiện khi tôi có tùy chọn sắp xếp dữ liệu bằng cơ sở dữ liệu để gửi lại cho tôi theo thứ tự tăng dần / giảm dần hoặc truy xuất và tải dữ liệu vào logic của tôi, xử lý dữ liệu này trong hàng đợi ưu tiên và sắp xếp đống tất cả. Hoặc một cách khác là tìm kiếm các bản ghi bằng cơ sở dữ liệu thay vì tải một tập hợp con của các bản ghi và sử dụng một cái gì đó như tìm kiếm nhị phân để tìm bản ghi hoặc bản ghi mà tôi quan tâm.

Trong tâm trí của tôi, tôi sẽ cố gắng có nhiều hoạt động diễn ra trên cơ sở dữ liệu trước khi gửi nó đi vì giao tiếp rất tốn kém. Điều này cũng khiến tôi tự hỏi khi nào bạn sử dụng thuật toán và cấu trúc dữ liệu được xác định nghiêm ngặt trong logic của riêng bạn thay vì xử lý dữ liệu so với cơ sở dữ liệu?

Vì vậy, đây là những câu hỏi ...

Câu hỏi

  1. Sự khác biệt giữa cấu trúc dữ liệu và cơ sở dữ liệu là gì?
  2. Khi nào chúng ta sử dụng các thuật toán sử dụng các cấu trúc dữ liệu được xác định chỉ trong logic của riêng bạn chứ không phải của các cơ sở dữ liệu?
  3. @Harvey post: Khi nào các phương thức trong cơ sở dữ liệu trở nên kém hiệu quả hơn so với các phương thức trong logic của riêng bạn?
    • @mirculixx post: Điều gì làm cho một phương pháp hiệu quả?
  4. @Harvey post: Làm thế nào để xử lý dữ liệu với cấu trúc dữ liệu nhanh hơn so với thực hiện trong cơ sở dữ liệu?

Làm rõ

  1. @Grant post: Các cơ sở dữ liệu tôi thường làm việc cùng là quan hệ và những câu hỏi này sẽ được đưa ra khi làm việc với chúng. Tuy nhiên, tôi nghĩ những câu hỏi này có thể áp dụng cho bất kỳ khuôn khổ kiên trì nào (khi tôi nói khung, tôi có nghĩa là nó theo nghĩa chung nhất).

Tôi biết câu trả lời mà không có một bối cảnh cụ thể là khó khăn. Thực phẩm cho suy nghĩ, lời khuyên hoặc các điểm thảo luận chủ yếu là những gì tôi đang tìm kiếm và sẽ được đánh giá cao nhất!


Cơ sở dữ liệu datomic.com gần với người dùng hơn so với cơ sở dữ liệu quan hệ truyền thống. Bạn chỉ nhìn vào cơ sở dữ liệu truyền thống?
Công việc

@Job Không, cơ sở dữ liệu quan hệ không phải là điều duy nhất tôi đang xem xét ở đây. Đó là tìm hiểu thêm về sự khác biệt giữa các cấu trúc dữ liệu trong logic so với cấu trúc dữ liệu trong cơ sở dữ liệu / đơn vị lưu trữ.
hulkmeister

Như một quy tắc chung tôi sẽ nói - sử dụng cơ sở dữ liệu nếu bạn có thể, nhưng nếu nó trở nên quá chậm, thì hãy sử dụng các cấu trúc dữ liệu. Sao chép dữ liệu (ví dụ: bộ nhớ đệm) là xấu vì bạn phải giữ đồng bộ hai dữ liệu, vì vậy hãy tránh nó trừ khi bạn không thể.
Công việc

Gửi dữ liệu đến cơ sở dữ liệu chỉ để sắp xếp nó? Thích lái xe quanh khối để thay đổi suy nghĩ của bạn?

Câu trả lời:


18

Cấu trúc dữ liệu hầu hết là:

  1. Cư dân bộ nhớ,
  2. Tạm thời,
  3. Giới hạn về kích thước,
  4. Không đăng ký lại mà không thêm các cơ chế đồng thời như khóa hoặc bất biến,
  5. Không tuân thủ ACID ,
  6. Nhanh, nếu chọn cẩn thận.

Cơ sở dữ liệu hầu hết là:

  1. Giới hạn đĩa,
  2. Kiên trì,
  3. Lớn,
  4. An toàn đồng thời,
  5. Tuân thủ ACID, với khả năng giao dịch ,
  6. Chậm hơn cấu trúc dữ liệu

Các cấu trúc dữ liệu có nghĩa là được truyền từ nơi này sang nơi khác và được sử dụng nội bộ trong một chương trình. Lần cuối cùng bạn gửi dữ liệu từ một trang web đến máy chủ web bằng cơ sở dữ liệu hoặc thực hiện một phép tính trên cơ sở dữ liệu hoàn toàn nằm trong bộ nhớ là khi nào?

Hệ thống cơ sở dữ liệu sử dụng cấu trúc dữ liệu như là một phần của việc thực hiện nội bộ của chúng. Đó là một câu hỏi về kích thước và phạm vi; bạn sử dụng các cấu trúc dữ liệu trong chương trình của mình, nhưng hệ thống cơ sở dữ liệu một chương trình theo đúng nghĩa của nó.


Về nhận xét máy chủ từ trang web đến web, tôi đồng ý rằng bạn sẽ không sử dụng cơ sở dữ liệu ở đó, nhưng tôi thấy khả năng có một servlet để xử lý hoặc dịch dữ liệu đó để duy trì cơ sở dữ liệu. Nó nằm giữa tầng giữa và tầng dữ liệu nơi mọi thứ trở nên hơi lộn xộn. Để đơn giản hóa câu hỏi, khi nào các phương thức trong cơ sở dữ liệu trở nên ít có lợi để sử dụng hơn các phương thức trong logic?
hulkmeister

1
Chà, đó là bánh mì và bơ của DAL, phải không? DAL tồn tại để dễ dàng chuyển đổi giữa các đối tượng và bản ghi cơ sở dữ liệu. DAL phù hợp với khoảng 80 đến 90 phần trăm những gì bạn muốn làm với cơ sở dữ liệu, nhưng trong 10 đến 20 phần trăm còn lại, bạn có thể muốn quay lại SQL thô hoặc các thủ tục được lưu trữ, vì nó hiệu quả hơn.
Robert Harvey

Trong ví dụ của bạn về sắp xếp / lọc, bạn đúng rằng bạn có thể muốn thực hiện kiểu xử lý đó trên máy chủ cơ sở dữ liệu. Nhưng rất có thể bạn vẫn sẽ nhận được kết quả của quá trình xử lý đó dưới dạng một số dạng cấu trúc dữ liệu.
Robert Harvey

Những điểm bạn đã đưa ra đã thực sự nhiều thông tin. Tuy nhiên, vẫn còn điều gì đó cằn nhằn với tôi về các phương thức (hoặc thuật toán) hoạt động trực tiếp với cơ sở dữ liệu hoặc chỉ với các cấu trúc dữ liệu theo logic hoặc cả hai. Tôi đang xem mục 6 của cả hai danh sách bạn đặt ra, và câu hỏi xuất hiện trong đầu là làm thế nào để nhanh hơn cái kia? Tôi luôn cảm thấy làm việc với dữ liệu tại nguồn là cách nhanh nhất để giải quyết mọi việc. Bạn có thể cập nhật trong bài viết của mình - Tôi sẽ đọc lại nó.
hulkmeister

1
Cơ sở dữ liệu chậm hơn vì một số lý do. Mặc dù vậy, bạn phải đọc dữ liệu từ đĩa, sử dụng câu lệnh SQL phải được biên dịch, có kế hoạch thực hiện thường xuyên liên quan đến nhiều bảng. Quá trình phức tạp hơn nhiều. Ngoài ra, bạn thường vẫn phải chuyển kết quả qua dây, nơi bạn dịch dữ liệu thành cấu trúc dữ liệu để bạn có thể làm việc với nó.
Robert Harvey

6

Sự khác biệt giữa cấu trúc dữ liệu và cơ sở dữ liệu là gì?

Ở mức độ trừu tượng, không có gì - cơ sở dữ liệu cấu trúc dữ liệu.

Ở cấp độ cụ thể, cơ sở dữ liệu thường có mục đích lưu giữ dữ liệu, thường ở định dạng được tối ưu hóa cho mục đích chèn, cập nhật, truy xuất, tham gia hoặc một số mục đích khác (hoặc kết hợp).

Ví dụ: nếu bạn so sánh một bảng trong RDBMS để nói một mảng dữ liệu, sự khác biệt có thể là về thời gian chạy của thuật toán, số lượng mã bạn phải viết, dung lượng bộ nhớ bạn cần để chạy thuật toán hoặc tính linh hoạt để làm việc / truy cập dữ liệu từ bên ngoài chương trình / thuật toán của bạn.

Khi nào chúng ta sử dụng các thuật toán sử dụng các cấu trúc dữ liệu được xác định chỉ trong logic của riêng bạn chứ không phải của các cơ sở dữ liệu?

Trong xu hướng tôi sẽ tranh luận

a) để sử dụng cơ sở dữ liệu nếu bạn cần duy trì dữ liệu theo cách có thể truy cập được ngoài thời gian chạy hoặc mục đích của thuật toán cụ thể.

b) để sử dụng cấu trúc dữ liệu (trong bộ nhớ) của riêng bạn nếu không có vấn đề về tốc độ thời gian chạy hoặc không cần kiên trì

Ví dụ: nếu thuật toán của bạn xử lý hồ sơ khách hàng, bạn có thể muốn lưu trữ các hồ sơ khách hàng đó (nói là tìm tất cả khách hàng trong một khu vực cụ thể) để sử dụng sau bởi một số chương trình / thuật toán khác và cho mục đích hoàn toàn khác (nói để tìm khách hàng có giá trị nhất ). Trong trường hợp đó, sử dụng cơ sở dữ liệu để duy trì dữ liệu có lẽ là một ý tưởng tốt.

Tuy nhiên, lưu ý rằng có khái niệm về cơ sở dữ liệu trong bộ nhớ không nhất thiết phải duy trì dữ liệu, vì lý do hiệu suất. Ví dụ: Redis hoặc HANA .

Khi nào các phương thức trong cơ sở dữ liệu trở nên kém hiệu quả hơn so với các phương thức trong logic của riêng bạn?

Câu trả lời phụ thuộc rất nhiều vào hoàn cảnh và cơ sở dữ liệu (loại) đang sử dụng. Tôi sẽ viết lại câu hỏi thành "điều gì làm cho một phương pháp hiệu quả?" Sau đó, nó trở thành một bài tập đánh giá các phương thức (= thuật toán) mà bạn sẽ sử dụng cho cấu trúc dữ liệu của riêng bạn so với các phương thức được sử dụng bởi cơ sở dữ liệu. Cũng xem điểm tiếp theo.

Làm thế nào là xử lý dữ liệu với cấu trúc dữ liệu nhanh hơn so với thực hiện trong cơ sở dữ liệu?

Một lần nữa, điều này phụ thuộc vào chi tiết cụ thể. Nói chung, việc xử lý dữ liệu trong bộ nhớ, có thể truy cập trực tiếp vào quy trình chạy thuật toán của bạn, nhanh hơn gửi yêu cầu đến quy trình khác (trong cùng một máy tính hoặc qua mạng) và yêu cầu nó gửi lại kết quả . Tuy nhiên, nếu dữ liệu đã nằm trong cơ sở dữ liệu, gửi lệnh đó - giả sử một câu lệnh SQL để nối hai bảng và tính toán một số hàm tổng hợp - và chỉ lấy một bản tóm tắt nhỏ hoặc tập hợp con của dữ liệu có thể hiệu quả hơn nhiều so với lần đầu tiên chuyển tất cả dữ liệu và tính toán kết quả cục bộ (sử dụng cấu trúc dữ liệu của riêng bạn).


1

Truy cập đĩa chủ yếu là những gì đắt nhất trong hoạt động này, thường xuyên hơn so với truy cập mạng (http://serverfault.com/questions/238417/are-networks-now-faster-than-disks). Trừ khi cơ sở dữ liệu của bạn không nằm trên mạng ít nhất là 1 Gbps và cùng mạng với máy chủ ứng dụng web \ của bạn, hiệu suất mạng sẽ không quan trọng bằng hiệu suất đĩa cho các bộ dữ liệu lớn hơn. Hoặc nếu dữ liệu của bạn xảy ra trên các đĩa trạng thái rắn rất nhanh sẽ nhanh hơn truy cập mạng thông thường. Ngoài ra, cơ sở dữ liệu thường cung cấp một cơ chế IPC như các đường dẫn được đặt tên thay vì sử dụng TCP / IP nếu cơ sở dữ liệu nằm trên cùng một máy chủ với máy chủ ứng dụng của bạn.

Nếu bạn có thể giữ hầu hết \ cấu trúc dữ liệu enire trong bộ nhớ giữa các yêu cầu thì đây thường sẽ là đặt cược nhanh nhất của bạn. Nếu bạn không thể, thì thật khó để đánh bại một cấu trúc cơ sở dữ liệu tốt với các bảng được chuẩn hóa và các chỉ số thích hợp để tìm kiếm và cập nhật hiệu suất trên bất kỳ thứ gì ngoài các bộ hồ sơ nhỏ, đặc biệt là trong một hệ thống có hàng triệu bản ghi.

Cơ sở dữ liệu quan hệ thường sử dụng cây B + hoặc một biến thể của nó dưới mui xe và có nhiều tối ưu hóa như căn chỉnh dữ liệu trên đĩa và vùng đệm cho các bản ghi thường xuyên truy cập. Điều này làm cho chúng nổi trội trong việc xử lý các bộ dữ liệu lớn một cách nhanh chóng, đặc biệt là nếu tổng hợp hoặc lọc có liên quan.


Xin vui lòng cho tôi biết nếu tôi có quyền này. Áp dụng những gì bạn nói, bất cứ khi nào tôi nghĩ về việc làm việc với dữ liệu, nếu tôi có thể giữ bộ làm việc được lưu trong bộ nhớ cache, điều đó sẽ nhanh hơn. Nếu không, hãy thử sử dụng cơ sở dữ liệu để cung cấp các kết quả đó hoặc tìm cách nào đó để liên quan đến việc truy vấn cơ sở dữ liệu nhiều hơn?
hulkmeister

@hulkmeister nói chung, trừ khi tập dữ liệu rất nhỏ hoặc cơ sở dữ liệu ở xa vị trí của bạn trên mạng chậm.
Peter Smith

0

Bạn có ý nghĩa gì bởi một cơ sở dữ liệu? Bạn có nghĩa là một cơ sở dữ liệu quan hệ như MySQL hoặc SQL Server? Cơ sở dữ liệu quan hệ là một cấu trúc dữ liệu meta hỗ trợ một số tập hợp con của các hoạt động được xác định bởi mô hình quan hệ . Lý thuyết về mô hình quan hệ được Edgar Codd thực hiện vào những năm 60.

Mô hình quan hệ có mục đích rất chung và linh hoạt, nhưng điều đó có nghĩa là nó không thể tận dụng bất kỳ lợi thế nào của cấu trúc trong dữ liệu hoặc các mẫu truy cập. Cấu trúc dữ liệu rất hữu ích khi bạn biết điều gì đó về dữ liệu và cách nó sẽ được truy cập. Ví dụ: nếu bạn biết dữ liệu cuối cùng bạn đưa vào cấu trúc dữ liệu sẽ là dữ liệu đầu tiên bạn muốn, bạn có thể sử dụng ngăn xếp.

Tôi gọi cơ sở dữ liệu quan hệ là cấu trúc dữ liệu meta vì nó thường là phần mềm khá lớn sử dụng nhiều cấu trúc dữ liệu như ngăn xếp, hàng đợi, cây và danh sách để tạo cấu trúc dữ liệu trừu tượng của bảng quan hệ.


Xin lỗi, chỉ cần làm rõ về "khá chút wad" có nghĩa là gì đối với đoạn cuối?
hulkmeister

@hulkmeister, xin lỗi đó đáng lẽ phải là 'lớn' chứ không phải 'bit'. mô hình quan hệ là rất trừu tượng và khá phức tạp. Việc cung cấp một triển khai thực sự thực hiện đầy đủ, đặc biệt là cung cấp ACID ((Nguyên tử, nhất quán, cô lập, độ bền) cần rất nhiều mã khá phức tạp chạy phía sau hậu trường.
Charles E. Grant
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.