Có thể là một ý tưởng tốt để tạo một bảng mới cho mỗi khách hàng của một ứng dụng web?


10

Đây chỉ là giả thuyết và vì tôi chưa có kinh nghiệm xử lý các bảng cơ sở dữ liệu lớn, tôi không biết liệu điều này có kinh khủng không vì một số lý do. Về tình hình:

Hãy tưởng tượng một ứng dụng dựa trên web - giả sử phần mềm kế toán - có 20.000 khách hàng và mỗi khách hàng có hơn 1000 mục trong một bảng. Đó là 20 triệu hàng mà tôi biết chắc chắn có thể làm chậm các truy vấn phức tạp.

Trong trường hợp như thế này, có ý nghĩa hơn khi tạo một bảng mới trong cơ sở dữ liệu cho mỗi khách hàng không? Làm thế nào để cơ sở dữ liệu phản ứng với việc có bảng 20k (hoặc hơn!)?

Câu trả lời:


15

Nói chung, không, thật vô nghĩa khi có một bảng (tôi nghĩ bạn thực sự có nghĩa là cơ sở dữ liệu ở đây) cho mỗi khách hàng. 20 triệu hàng tương đối nhỏ cho một bảng cơ sở dữ liệu. Tốc độ truy vấn không phải là một vấn đề miễn là cơ sở dữ liệu được điều chỉnh (lập chỉ mục) chính xác và các truy vấn được đặt cùng nhau một cách chính xác. Bất cứ lợi ích nào bạn nghĩ rằng bạn nhận được từ việc tách chúng ra sẽ được bù đắp bởi sự phức tạp bổ sung của việc quản lý 20.000 cơ sở dữ liệu riêng lẻ. Đối với ex, điều gì xảy ra khi bạn muốn thay đổi cấu trúc bảng? Bây giờ bạn phải làm điều đó 20.000 lần!

Trường hợp tệ hơn, nếu cuối cùng bạn thấy rằng kích thước cơ sở dữ liệu đang trở thành một vấn đề, bạn luôn có thể chia chúng thành các cơ sở dữ liệu riêng biệt sau đó.


không, tôi có nghĩa là các bảng trong cơ sở dữ liệu. Tôi không thể tưởng tượng một lý do để tạo cơ sở dữ liệu cho mỗi khách hàng. Và nếu 20 triệu hàng là nhỏ, thì lớn là gì? Và bạn làm gì vào thời điểm đó?
Sẽ

1
@ChrisF, chính xác - có rất nhiều trường hợp trong đó mô hình công nghệ hoặc kinh doanh yêu cầu DB riêng cho mỗi khách hàng. Nhưng tôi không thể nghĩ ra một lý do cho các bảng riêng biệt trong cùng một DB.
GrandmasterB

1
@GrandmasterB - Tôi nghĩ rằng @Will đang hỏi sai câu hỏi.
ChrisF

1
@ Will: Nếu có thể, hãy đến một cuộc họp Nhóm người dùng Oracle hoặc tương đương với một số cơ sở dữ liệu cao cấp khác. Bạn sẽ thấy rằng những ý tưởng "nhỏ" và "lớn" của bạn cần rất nhiều điều chỉnh. Nó đã xảy ra với tôi. Gợi ý: nếu nó vừa trên một đĩa, nó không lớn theo tiêu chuẩn DBA.
David Thornley

1
@Gorton, InnoDB thường được coi là tốt hơn về độ tin cậy và đồng thời, MyISAM cho tốc độ. Vì vậy, bạn thực sự cần phải đánh giá các công cụ lưu trữ khác nhau dựa trên việc sử dụng cơ sở dữ liệu dự kiến ​​của ứng dụng cụ thể của bạn.
GrandmasterB

5

Nghe có vẻ là một ý tưởng tồi.

Đừng cố gắng vượt qua cơ sở dữ liệu với các công trình kỳ lạ như thế này. Các công cụ cơ sở dữ liệu được thiết kế với rất nhiều tối ưu hóa để xử lý các tập dữ liệu lớn. Ví dụ, những gì bạn đang mô tả âm thanh rất gần với một nỗ lực để thực hiện các chỉ mục theo cách thủ công. Chỉ cần sử dụng các chỉ mục được cung cấp bởi DB Engine, chúng được triển khai tốt hơn nhiều so với khả năng bạn có thể tự làm được và nó sẽ không cần bảo trì nhiều.

Ngoài ra, như một quy tắc chung của ngón tay cái. Tôi đề nghị không kiến ​​trúc cơ sở dữ liệu theo cách yêu cầu thao tác hoặc tạo cấu trúc cơ sở dữ liệu (bảng, trường) trong quá trình sử dụng bình thường của ứng dụng. Nó làm cho việc tối ưu hóa hiệu suất của một con gấu và thường buộc bạn phải cung cấp quá nhiều quyền cho người dùng để thực hiện các tác vụ thông thường có khả năng tạo ra lỗ hổng bảo mật.


Tôi sẽ upvote một lần cho mỗi hai đoạn của bạn nếu được phép.
David Thornley

3

Đây là một bài viết tôi luôn kêu gọi mọi người đọc, khi họ hỏi câu hỏi này:

http://datacharmer.blogspot.com/2009/03/n normalization-and-smart.html


Tôi không biết rằng DB tạo một tệp thực tế trên mỗi bảng = x
Will

1
Điều này có thể phụ thuộc vào RDBMS thực tế được sử dụng. MySQL thực hiện điều đó (tối đa ba tệp trên mỗi bảng nếu bạn sử dụng MyISAM). Những người khác có thể không.
Mchl

Phiên bản doanh nghiệp của SQL Server sẽ làm điều đó nếu bạn thiết kế theo cách đó, nhưng không tự động.
JeffO

Oracle chắc chắn không làm điều đó.
user281377

Oracle có thể làm điều đó, giống như cách mà SQL Server có thể làm điều đó, nhưng tôi không thể tưởng tượng được tại sao bạn lại thiết kế lược đồ của mình để có một tệp trên mỗi bảng. Việc chia cơ sở dữ liệu thành nhiều tệp có ý nghĩa, nhưng không phải là một tệp trên mỗi bảng.
Dean Harding

1

IMHO một bảng duy nhất không phải là một vấn đề, vì vậy đừng tạo ra một vấn đề trong đó một bảng không tồn tại - chưa. Có rất nhiều bạn có thể làm để giúp hiệu suất. Bạn có thể phân vùng một bảng thành nhiều tệp dựa trên clientID hoặc trường ngày để trợ giúp với IO. Db của bạn không phải theo dõi, tối ưu hóa và lưu trữ 20.000 câu lệnh sql khác nhau cho mọi truy vấn mà trang web của bạn sẽ cần. Bạn có thể lập chỉ mục bởi clientid. Khách hàng 20K có thể trả tiền cho rất nhiều phần cứng.

Đối với loại bảng này, có thể sử dụng db loại NoQuery.

Với 20K khách hàng, cơ sở dữ liệu có thể không phải là liên kết yếu nhất của bạn, vậy tại sao lại giới thiệu sự phức tạp này?


`Bạn có thể phân vùng một bảng thành nhiều tệp dựa trên clientID hoặc trường ngày để trợ giúp với IO.` - không chắc ý của bạn là gì. Bất kỳ làm rõ?
Sẽ

Nhiều tập tin trên hệ điều hành. Một máy chủ có thể đọc / ghi nhiều hơn vào nhiều tệp thay vì chỉ một.
JeffO

Tôi đoán ý tôi là: Tôi chưa bao giờ nghe về một điều như vậy, tôi tìm thêm thông tin ở đâu để làm việc này? :-) Nhưng tôi sẽ truy cập google ~
Will


0

Đó là cách tiếp cận thực sự xấu.

Phân vùng bảng theo chiều dọc, 2 máy chủ cơ sở dữ liệu một cho id người dùng lẻ và một máy chủ khác thậm chí sẽ hoạt động tốt (dữ liệu không liên quan giữa người dùng).

Sắp xếp dữ liệu theo user_id và nếu không thể, hãy lấy một lượng lớn RAM hoặc ổ SSD.

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.