Khi nào nên sử dụng cơ sở dữ liệu hơn là phân tích dữ liệu từ tệp văn bản?


13

Tôi đã thực hiện một chương trình Python để đo lường sự tăng trưởng của codereview.SE . Cách tiếp cận của tôi là lấy "Số liệu thống kê trang web" hiển thị trên trang nhất và lưu trữ chúng trên ổ cứng của tôi. Tôi dự định làm điều này một lần mỗi ngày. Cho đến nay tôi đã làm đủ để có được số liệu thống kê và nối chúng vào một tệp văn bản. Kịch bản python có thể được xem trên github . Định dạng tôi đang sử dụng là như sau

22-08-2013

questions 9073
answers 15326
answered 88
users 26102
visitors/day 7407

22-08-2013

questions 9073
answers 15326
answered 88
users 26102
visitors/day 7407

Tôi chỉ chạy tập lệnh hai lần để có được định dạng tôi sẽ sử dụng trong tệp. Ban đầu điều này có vẻ tốt với tôi bởi vì tôi sẽ tự lưu trữ nó và định dạng sẽ giống nhau nên nó sẽ dễ dàng được phân tích cú pháp nhưng tôi không chắc chắn. Có vẻ như việc sử dụng một cơ sở dữ liệu sẽ tốt hơn ở đây vì cách lấy dữ liệu sẽ dễ dàng hơn. Chỉ cần một lưu ý, tôi chưa bao giờ sử dụng bất kỳ cơ sở dữ liệu nào và không có kiến ​​thức về SQL, MySQL hoặc bất kỳ biến thể nào khác của RDBMS.

Vì vậy, điều này mang lại cho tôi câu hỏi. Khi nào nên ưu tiên cơ sở dữ liệu để lưu trữ dữ liệu hơn là lưu trữ dữ liệu trong tệp văn bản? Có một số gợi ý mà tôi có thể tìm kiếm khi đưa ra quyết định về việc tôi cần một cơ sở dữ liệu hoặc các tệp văn bản đơn giản không?

PS: Nếu các thẻ tốt hơn có thể được thêm vào xin vui lòng làm như vậy. Tôi đã có một số nghi ngờ về các thẻ có thể được thêm vào.


"Mỗi công cụ là một trách nhiệm pháp lý cho đến khi bạn học cách sử dụng nó."
JeffO

1
Một cơ sở dữ liệu có thể hoặc có thể không phù hợp với dự án của bạn. Tuy nhiên, bạn có thể thấy rằng sử dụng định dạng đơn giản hơn sẽ hữu ích. Có một mô-đun CSV theo tiêu chuẩn với Python mà bạn có thể cân nhắc sử dụng. Có CSV sẽ đơn giản hóa việc xuất dữ liệu vào các chương trình khác (ví dụ - vào bảng tính để bạn có thể vẽ biểu đồ).
Sean McS Something

Câu trả lời:


13

Khi nào nên ưu tiên cơ sở dữ liệu để lưu trữ dữ liệu hơn là lưu trữ dữ liệu trong tệp văn bản?

Wikipedia cho chúng ta biết rằng một cơ sở dữ liệu là một bộ sưu tập dữ liệu có tổ chức . Theo biện pháp đó, tệp văn bản của bạn một cơ sở dữ liệu. Nó tiếp tục nói:

Dữ liệu thường được tổ chức để mô hình hóa các khía cạnh liên quan của thực tế theo cách hỗ trợ các quy trình yêu cầu thông tin này. Ví dụ, mô hình hóa sự sẵn có của các phòng trong khách sạn theo cách hỗ trợ tìm khách sạn có chỗ trống.

Phần đó mang tính chủ quan - nó không cho chúng ta biết cụ thể dữ liệu nên được mô hình hóa như thế nào hoặc những hoạt động nào cần được tối ưu hóa. Tệp văn bản của bạn bao gồm một số bản ghi riêng biệt, mỗi bản ghi mỗi ngày, vì vậy bạn đang mô hình hóa một khía cạnh của thực tế theo cách có liên quan đến vấn đề của bạn.

Tôi nhận ra rằng khi bạn nói "cơ sở dữ liệu" có lẽ bạn đang nghĩ đến một loại hệ thống quản lý cơ sở dữ liệu quan hệ nào đó, nhưng nghĩ về tệp văn bản của bạn khi cơ sở dữ liệu thay đổi câu hỏi của bạn từ "khi nào tôi nên sử dụng cơ sở dữ liệu?" thành "loại cơ sở dữ liệu nào tôi nên sử dụng?" Nhìn thấy mọi thứ trong ánh sáng đó giúp câu trả lời dễ nhìn hơn: sử dụng cơ sở dữ liệu tốt hơn khi cơ sở dữ liệu bạn không còn đáp ứng yêu cầu của bạn.

Nếu tập lệnh Python và tệp văn bản đơn giản của bạn hoạt động đủ tốt, thì không cần phải thay đổi. Chỉ với một kỷ lục mới mỗi ngày và máy tính trở nên nhanh hơn mỗi năm, tôi nghi ngờ rằng giải pháp hiện tại của bạn có thể khả thi trong một thời gian dài. Dữ liệu của một thập kỷ sẽ chỉ cung cấp cho bạn 3650 bản ghi mà một khi được phân tích cú pháp có thể sẽ cần ít hơn 75 kilobyte.

Hãy tưởng tượng rằng thay vì một bản ghi nhỏ mỗi ngày, bạn đã quyết định ghi lại mọi câu hỏi được hỏi trên CodeReview, ai đã hỏi nó và khi nào. Hơn nữa, bạn cũng thu thập tất cả các câu trả lời và siêu dữ liệu có liên quan. Bạn có thể lưu trữ tất cả những thứ đó trong một tệp văn bản, nhưng một tệp phẳng sẽ gây khó khăn cho việc tìm kiếm thông tin khi bạn cần. Có quá nhiều dữ liệu để đọc toàn bộ vào bộ nhớ, vì vậy bất cứ khi nào bạn muốn tìm câu hỏi hoặc câu trả lời, bạn phải quét qua tệp cho đến khi bạn tìm thấy những gì bạn đang tìm kiếm. Khi bạn muốn tìm tất cả các câu hỏi của một người dùng nhất định, bạn phải quét toàn bộ tệp. Nếu bạn muốn tìm tất cả các câu hỏi có "lỗi" dưới dạng thẻ, bạn phải quét qua tệp.

Điều đó sẽ chậm khủng khiếp, vì vậy bạn có thể quyết định tăng tốc mọi thứ bằng cách xây dựng một số chỉ mục cho bạn biết nơi cần tìm trong tệp để tìm một bản ghi đã cho. Bạn có thể có một chỉ mục cho các câu hỏi, một chỉ số khác cho người dùng, một phần ba cho câu trả lời, v.v. Khi bạn muốn tìm một câu hỏi bạn tìm kiếm chỉ mục câu hỏi (nhỏ hơn nhiều), hãy tìm vị trí của câu hỏi trong tệp dữ liệu chính và nhanh chóng chuyển đến đúng vị trí trong tệp. Đó sẽ là một cải tiến hiệu suất lớn. Thật vậy, đó là khá nhiều những gì một hệ thống quản lý cơ sở dữ liệu.

Vì vậy, sử dụng DBMS khi đó là những gì bạn cần. Sử dụng nó khi bạn có nhiều dữ liệu, khi bạn cần có thể truy cập dữ liệu đó một cách nhanh chóng và có lẽ theo những cách mà bạn không thể dự đoán hoàn toàn ngay từ đầu. Nếu bạn có các loại dữ liệu khác nhau - các loại bản ghi khác nhau - được kết nối với nhau, hãy sử dụng RDBMS để bạn có thể liên kết các bản ghi khác nhau một cách thích hợp.


3
"Nghĩ về tệp văn bản của bạn khi cơ sở dữ liệu thay đổi" Rất sâu sắc. Ngoài ra phần về tôi chỉ có 3650 mục là hữu ích. Nó đã giúp để có được một quan điểm thực sự của vấn đề.
Aseem Bansal

1
Câu trả lời bị đánh giá thấp, đây là lần thứ hai tôi quay lại với nó.
Hashim

6

Cơ sở dữ liệu có nhiều lợi thế, nhưng làm cho việc truy cập dễ dàng hơn không phải là một trong số đó. Nhanh hơn, chuẩn hơn, có thể hiểu là một ngôn ngữ lệnh nhúng, an toàn hơn, có - nhưng không dễ hơn. Cho dù ngôn ngữ và thư viện tiêu chuẩn của bạn cung cấp bao nhiêu đường, bạn phải có cơ sở dữ liệu ngay từ đầu, mở kết nối với nó và định tuyến dữ liệu từ chương trình của bạn một cái gì đó hoàn toàn khác và ngược lại. Miễn là không có vấn đề gì với những gì bạn làm và dễ lập trình là ưu tiên của bạn, đừng bao giờ chuyển sang cơ sở dữ liệu chỉ vì bạn nghĩ đó là "thực hành tốt".

Tôi đảm nhận khi thực hiện chuyển đổi là để theo dõi sự phát triển lịch sử. Rốt cuộc, mọi người đã lưu trữ dữ liệu trong các tệp trong một thời gian dài trước khi DB quan hệ được phát minh và trên thực tế, toàn bộ các mô hình cơ sở dữ liệu kém hơn (DB phân cấp, DB mạng ...) đã được phát minh trước đó. Họ bắt đầu viết các cơ sở dữ liệu và sử dụng chúng khi thấy rõ rằng điều này sẽ tiết kiệm công sức xử lý lớn, tăng độ tin cậy, v.v ... nói chung và về lâu dài . Miễn là đó không phải là trường hợp của bạn, và bạn không dự đoán nó sẽ trở thành trường hợp sớm, chuyển đổi sẽ là quá kỹ thuật.


Không phải là sự gắn kết được cung cấp tốt hơn theo thiết kế tổng thể? ví dụ trong trường hợp của tôi, tôi đang lưu trữ 5 giá trị tương ứng với mỗi ngày. Ở trạng thái hiện tại không có bất kỳ sự gắn kết nào giữa các dữ liệu.
Aseem Bansal

Bạn đúng, đảm bảo rằng tất cả các bản ghi có một tập hợp các trường và giá trị nhất quán là một trong những lợi thế này. (Nói đúng ra nó chỉ là quan hệ cơ sở dữ liệu mà đảm bảo rằng người sử dụng cơ sở dữ liệu không quan hệ trong sản xuất trong một thời gian dài, và hiện nay họ đang đạt được lực kéo lại với phong trào "NoSQL"..)
Kilian Foth

3

Tất nhiên đây sẽ là một cuộc gọi phán xét, nhưng ba tiêu chí chính tôi sẽ xem xét là: nó có cần phải tuân thủ ACID không , mức độ phức tạp của dữ liệu và cuối cùng, có bao nhiêu điều cần đọc / ghi. Miễn là bạn chỉ cần đọc và viết một dòng trên mỗi ứng dụng và ứng dụng của bạn là ứng dụng duy nhất thực hiện đọc hoặc viết, bạn có thể bỏ qua cơ sở dữ liệu. Khi bạn bắt đầu có nhiều ứng dụng đọc hoặc viết hoặc cấu trúc dữ liệu của bạn trở nên phức tạp (đặc biệt nếu nó có mối quan hệ giữa các dòng riêng biệt) thì DB bắt đầu trông thực sự hấp dẫn.


"Có bao nhiêu thứ cần đọc / viết nó" - Điều đó đã giúp.
Aseem Bansal

2

Cơ sở dữ liệu được sử dụng để không chỉ lưu trữ mà còn thao tác và truy vấn dữ liệu, do đó bạn phải đưa ra quyết định có học thức:

Một yếu tố lớn là lợi ích bạn nhận được từ việc cài đặt cơ sở dữ liệu trên máy so với chức năng mà nó mang lại

Rõ ràng nếu bạn cần truy vấn và thao tác dữ liệu và bạn muốn truy cập nhanh hơn - và ngoài ra bạn có thể nghĩ về việc sử dụng cơ sở dữ liệu cho các chức năng khác thì đó có thể là một ý tưởng tốt. Các mô hình lưu trữ cơ sở dữ liệu cho phép dữ liệu được tra cứu theo các giá trị chính rất nhanh và tôi có thể tưởng tượng việc phân tích một tệp thể chậm (tùy thuộc vào cách bạn đang thực hiện)

Nếu bạn muốn chơi với SQL và những gì nó có thể làm, SQLFiddle.com có ​​một vài mô hình RDBMS khác nhau mà bạn có thể chơi xung quanh (chạy truy vấn, tạo lược đồ, v.v.)


Python có giao diện thư viện chuẩn được xây dựng cho sqlite3. Vì vậy, cài đặt cơ sở dữ liệu không phải là một vấn đề. Cân nhắc của tôi là nếu tôi tiếp tục lưu trữ dữ liệu thì trừ khi tôi có một số loại lập chỉ mục thì nó có thể trở nên chậm. Một cơ sở dữ liệu có thể chăm sóc điều đó, tôi nghĩ. Tôi đã tải xuống sqlite3 một cách riêng biệt để tìm hiểu nó, thấy rằng tôi cần tìm hiểu về các mô hình cơ sở dữ liệu trước khi sử dụng cơ sở dữ liệu, đã thử nó. Tôi có thể học sqlite3 bằng các ví dụ dựa trên internet nhưng hiện đang gặp vấn đề khi học các mô hình cơ sở dữ liệu. Sau đó, nó đến với tâm trí của tôi nếu nó thậm chí có giá trị rắc rối?
Aseem Bansal

2

Như luôn luôn sử dụng một cơ sở dữ liệu hay không phụ thuộc vào những gì bạn cần làm. Nếu bạn có một lượng dữ liệu khổng lồ và bạn cần thực hiện nhiều truy vấn khác nhau trên đó, có lẽ một cơ sở dữ liệu có thể giúp bạn.

Trong trường hợp của bạn, tôi sẽ giữ bộ lưu trữ trong một tệp thử nghiệm cho đến khi hiệu suất được chấp nhận. Thông thường việc đọc một tệp văn bản (thậm chí lớn) sẽ không mất nhiều thời gian. Nếu bạn cần thêm bạn luôn có thể thêm cơ sở dữ liệu sau.

Theo kinh nghiệm của tôi, nếu bạn hoàn toàn mới đối với cơ sở dữ liệu, bạn có thể thấy dễ dàng hơn khi sử dụng một cái gì đó như couchdb: http://couchdb.apache.org/ không có sql và bạn có thể sử dụng trực tiếp javascript hoặc python, v.v. để truy vấn.

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.