Làm cách nào để mô hình hóa dữ liệu từ CSV tùy ý trong cơ sở dữ liệu?


7

Tôi đang thiết lập một giao diện web để quản lý dữ liệu. Người dùng tải lên CSV hoặc các tệp có cấu trúc tương tự và tôi muốn lưu trữ chúng trong cơ sở dữ liệu để họ có thể thực hiện các thao tác trên chúng - lọc, sắp xếp, vẽ biểu đồ, v.v.

Tôi không biết làm thế nào để mô hình hóa điều này đúng trong cơ sở dữ liệu. Tôi có một vài ý tưởng, nhưng dường như không có cách nào phù hợp để thực hiện nó.

  1. Tạo một bảng mới cho mỗi CSV đã tải lên. Điều này có nghĩa là mỗi cột có thể được nhập một cách thích hợp (số nguyên, chuỗi, ngày, v.v.) và mỗi bản ghi sẽ tương ứng với một dòng trong tệp CSV. Đây có vẻ như là một khái niệm tự nhiên của vấn đề - nhưng hiệu suất sẽ trở thành vấn đề nếu tôi phải tạo một bảng mới cho mỗi tệp được tải lên?

  2. Tạo một bảng trong đó mỗi bản ghi đại diện cho một tập dữ liệu (CSV) và có các bảng khác trong đó các điểm dữ liệu có id dữ liệu của chúng trong bản ghi của chúng. Điều này có nghĩa là tất cả dữ liệu từ một tập dữ liệu nhất định được trải đều trên các bảng khác nhau và sẽ có rất nhiều dư thừa (vì mỗi điểm dữ liệu sẽ lưu trữ id của tập dữ liệu). Tuy nhiên, điều đó có nghĩa là các bảng sẽ không phải được tạo trên mỗi tập dữ liệu.

  3. Các biến thể khác trên 2. Hầu hết các suy nghĩ khác của tôi là các biến thể trên số 2 với nhiều mức độ khác nhau.

Câu hỏi của tôi về cơ bản là "Làm thế nào để tôi mô hình hóa điều này đúng?", Nghĩa là, với khả năng mở rộng hợp lý.

Hầu hết các dữ liệu sẽ là khoa học, vậy làm cách nào để tôi xử lý nhiều tập dữ liệu có kích thước khác nhau từ tầm thường (giả sử, 10 cột và 100 hàng) đến lớn (hàng trăm cột và hàng nghìn / triệu hàng)?

tl; dr: Làm cách nào để tôi mô hình hóa dữ liệu tùy ý từ số lượng CSV được tạo tốt trong cơ sở dữ liệu và một bảng mới cho mỗi CSV có thể chấp nhận được không?


1
Bạn có thể quan tâm đến câu hỏi này . Tôi đang tạo DB cho dữ liệu do người dùng xác định, nhưng tất cả dữ liệu đó có các định dạng khác nhau như CSV hoặc Excel, vì vậy tình huống của tôi rất giống với bạn
Rachel

Cảm ơn, điều này dường như không giải quyết một vấn đề rất tương tự. Bạn có mong đợi nhiều bảng như vậy để thực hiện chấp nhận?
msolomon

Có bao nhiêu CSV bạn sẽ xử lý? Một vài chục bảng là hợp lý (nhưng hầu như không đáng để xây dựng một hệ thống hơn), trong khi một vài trăm bảng ngày càng khó quản lý hơn. Vài ngàn? Tôi sẽ không muốn bị mắc kẹt với cơ sở dữ liệu đó.
Kirk Broadhurst

Câu trả lời:


3

Câu hỏi quá rộng mở đến mức khó có thể nói nhiều.

Và tại sao bạn lại sử dụng một cơ sở dữ liệu? Excel thực hiện mọi thứ bạn đã mô tả cho đến nay.

Nghiêm túc, tránh làm cho một hệ thống bên trong cơ sở dữ liệu của bạn có thể lưu trữ bất kỳ loại dữ liệu. Bạn đã có một cái, được gọi là một cơ sở dữ liệu. Tạo mã tạo các bảng bạn cần. Điều gì là xấu về điều đó? Tôi nói phương án 1.

Bạn có biết, nếu bạn muốn linh hoạt vô hạn thì làm thế nào về một bảng trắng dặm vuông?


Việc tạo một số lượng bảng tùy ý (như trong số lượng người dùng tiềm năng lớn, mỗi người sẽ tải lên một số lượng lớn các tệp có thể tạo một bảng mới) tốt hơn so với các tùy chọn khác?
msolomon

Cơ sở dữ liệu được thiết kế để chứa một lượng lớn thông tin trong các thùng chứa được gọi là bảng. Dữ liệu bạn muốn lưu trữ đã ở dạng bảng (giống như bảng). Để bạn xây dựng một "hệ thống bên trong" lưu trữ siêu dữ liệu về các đối tượng giống như bảng của bạn, do đó tất cả chúng có thể được đặt trong một bảng, theo định nghĩa sẽ hoạt động kém hơn vì bạn đang sử dụng cùng một hệ thống cơ bản, nhưng thực hiện lại nhiều các tính năng của nó trong đó. Tạo mỗi bảng trong cơ sở dữ liệu. Đừng tạo hệ thống "lưu trữ bảng" của riêng bạn trên đầu cơ sở dữ liệu. Tôi đã xây dựng cơ sở dữ liệu EAV một lần mà tôi vẫn duy trì ... đau đớn.
ErikE

Phân chia từng người dùng của bạn thành lược đồ riêng của mình ...
ErikE

1

MySQL có một công cụ CSV có thể giúp bạn .. Tuy nhiên tôi chưa bao giờ thử nghiệm thành công.

Công cụ CSV có thể coi các tệp giá trị được phân tách bằng dấu phẩy (CSV) dưới dạng bảng, nhưng nó không hỗ trợ các chỉ mục trên chúng. Công cụ này cho phép bạn sao chép các tệp vào và ra khỏi cơ sở dữ liệu trong khi máy chủ đang chạy. Nếu bạn xuất tệp CSV từ bảng tính và lưu tệp đó trong thư mục dữ liệu của máy chủ MySQL, máy chủ có thể đọc tệp đó ngay lập tức. Similary, nếu bạn ghi dữ liệu vào bảng CSV, một chương trình bên ngoài có thể đọc nó ngay lập tức. Các bảng CSV đặc biệt hữu ích như một định dạng trao đổi dữ liệu và cho một số loại ghi nhật ký nhất định.

Tôi tin rằng bạn cần tạo bảng bằng công cụ CSV và đặt cho nó cấu trúc và tên giống như tệp CSV. Có lẽ tự động hóa quá trình này khá dễ dàng.

Sau đó, bạn chỉ cần sao chép CSV của người dùng vào thư mục lưu trữ của máy chủ (về cơ bản thay thế tệp máy chủ được tạo .csv bằng người dùng, tên phải khớp chính xác).

Điều này không tạo một bảng cho mỗi tệp CSV, tuy nhiên


Điều này dường như là điều ngược lại với những gì tôi đang tìm kiếm. Tôi muốn lưu trữ dữ liệu từ CSV trong cơ sở dữ liệu được lập chỉ mục, nhưng điều này dường như lưu trữ dữ liệu từ cơ sở dữ liệu trong CSV không được lập chỉ mục.
msolomon

0

Suy nghĩ đầu tiên của tôi là lưu trữ CSV dưới dạng BLOB hoặc sử dụng FILESTREAM. Nếu bất kỳ 'lọc' hoặc 'vẽ đồ thị' nào cần diễn ra, các chức năng phía máy khách này có phải không?

Tôi không thể tưởng tượng bất cứ điều gì tồi tệ hơn việc tạo bảng cho mỗi tệp CSV. Một cơ sở dữ liệu với hàng chục ngàn bảng gần với ý tưởng của tôi về một cơn ác mộng.

Nếu bạn phải lưu trữ các điểm dữ liệu riêng lẻ (trái ngược với toàn bộ CSV dưới dạng một đối tượng) thì tôi sẽ lưu trữ dưới dạng XML được định dạng tốt, với mỗi bản ghi có một lược đồ liên quan để thống nhất hoặc giống như một tùy chọn nào đó 2.

Tôi đồng ý với câu trả lời của ErikE rằng bạn đang tạo lại một cái gì đó tồn tại, nhưng thường xuyên hơn tại sao bạn cần phải đưa những thứ này vào cơ sở dữ liệu và bạn cần làm gì với chúng? Mỗi CSV lý tưởng sẽ được lưu trữ dưới dạng một bảng duy nhất, nhưng hàng ngàn bảng chỉ là vấn đề đau đầu.


Tôi không thấy lý do tại sao chúng chỉ là các chức năng phía máy khách - Tôi muốn máy chủ có thể kéo dữ liệu đã chọn ra và tắt nó đi để vẽ đồ thị (giả sử, trên máy chủ vẽ đồ thị). Điều này sẽ không hoạt động nếu CSV là BLOB. Sẽ thật kinh khủng khi có hàng ngàn bảng nếu mỗi bảng được đặt tên hoàn toàn (ví dụ tiền tố)?
msolomon

Có gì sai với hàng ngàn bảng? Sự khác biệt thực sự duy nhất đối với công cụ là một chút chi phí trong siêu dữ liệu (siêu dữ liệu mà bạn phải lưu trữ bảng IN nếu bạn không). Các bảng, tên và quyền của chúng phải được quản lý hoàn toàn bằng mã và hoàn toàn tự động. Tôi thấy không có lý do gì mà đau đầu không thể tránh được với thiết kế tốt.
ErikE

Hàng ngàn bảng lưu trữ các loại dữ liệu tương tự giống như hàng ngàn procs được lưu trữ hoặc các chức năng thực hiện các nhiệm vụ tương tự - tốt hơn là tạo ra một số procs 'thông minh hơn' có thể thực hiện công việc của nhiều procs gần giống nhau. Đây chủ yếu là một vấn đề bảo trì. Tôi có thể thấy đối số cho hàng ngàn bảng hoàn toàn tự động nhưng với tôi nó có mùi rất tệ.
Kirk Broadhurst

0

Tôi muốn nói rằng nó thực sự phụ thuộc vào

  • có bao nhiêu loại tệp (bộ dữ liệu khác nhau) bạn sẽ xử lý
  • bạn biết bao nhiêu về dữ liệu
  • làm thế nào chung chung xử lý là

Nói, nếu có 1000 loại khác nhau và chúng được xử lý theo cùng một cách. Nói chung, tôi sẽ tải CSV trong cấu trúc chung (EAV) và trên đó tạo các bảng cụ thể. Trong trường hợp này, bạn phân tích CSV ở một nơi và có thể tiến gần hơn đến doanh nghiệp bằng cách tạo các bảng doanh nghiệp cụ thể với các loại dữ liệu đã xác định.

Nếu hiệu suất là một vấn đề - Mô hình EAV (một cột - một hàng cơ sở dữ liệu) có thể không hoạt động đơn giản (ví dụ CSV 4 GB), do đó bạn cần tải trực tiếp vào các bảng cụ thể. Nếu thời gian phát triển là đắt nhất trong tất cả và các tệp nhỏ, thì hãy tạo một cái gì đó chung chung. Khi bạn cần bảng cụ thể hơn - tạo lớp bổ sung của các bảng "bình thường". Một tùy chọn khác là tạo mã dựa trên siêu dữ liệu.

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.