2011-12-27 25 views
5

Câu hỏi này là tất cả về hiệu suất và tôi sẽ đánh giá cao nếu câu trả lời dành riêng cho trường hợp tôi cung cấp.Cách nào hiệu quả hơn: Một bảng dài hoặc bảng phân tán? và tại sao?

Làm cách nào hiệu quả hơn?

  • tạo một bảng với quá nhiều lĩnh vực
  • tạo nhiều hơn một bảng và phân phối các lĩnh vực tương tự như họ

TRƯỜNG HỢP: Một Web mở rộng CMS module

Pattern 1: Dài nhưng một bảng

cms 
----------------------------------------------- 
Id 
Title 
Description 
Images 
Order 
Status 
Publish 
meta_keywords 
meta_description 
meta_author 

Cleary, hầu hết CMS nguồn mở như joomla đều sử dụng mẫu trên. Nhưng tôi nghĩ, mô hình đó là giết chết tinh thần của RDBMS. Chúng ta có thể dễ dàng tách nội dung, cấu hình và meta của một bài viết cụ thể thành các bảng khác nhau. Như sau

Pattern 2: Nhiều nhưng liên quan đến bảng

Cms_content   cms_meta  cms_configuration 
--------------------------------------------------------------------------- 
Id     id    id   
Title    content_id  content_id 
Description   keywords  status 
Content    description  order 
Images    author   publish 

Lưu ý: Quan hệ trong trường hợp này là one-to-one

Đó là mô hình thích hợp để làm theo? Tại sao chọn một bảng dài nhưng một bảng, hoặc tại sao không chọn bảng phân tán, trên bảng đơn?

+1

"Đúng" luôn phụ thuộc vào mục đích và các trường hợp sử dụng. Không có viên đạn bạc – zerkms

+0

@zerkms, đã đồng ý đó là lý do tại sao tôi cũng cung cấp một trường hợp :) – Starx

+0

Ồ, ý bạn là "trường hợp". Được. Bất kỳ lý do nào để chia thực thể ** đơn ** thành các phần? Các trường thuộc về cùng một thực thể, lược đồ này thực hiện công việc của nó. Vì vậy, không chạm vào điều đó hoạt động ;-) – zerkms

Trả lời

5

duy nhất nguyên nhân chính đáng nhất có thể cho có dữ liệu denormalized (một bảng với nhiều cột) tôi có thể nghĩ ra, là:

  • sự lười biếng bằng văn bản SQL JOIN s
  • cải tiến hiệu suất tốt trên báo cáo đọc

tôi muốn đi cho các phiên bản bình thường tất cả các thời gian, bởi vì:

    .210
  • tôi có thể chắc chắn về toàn vẹn dữ liệu
  • tôi có thể trích xuất một cách dễ dàng thông tin từ DB (ví dụ, có bao nhiêu bài viết có một số meta, bao nhiêu METAS biệt có, vv)
+2

Tại sao bạn nói rằng 'dữ liệu không chuẩn hóa (một bảng có nhiều cột)'? Tất cả các trường thuộc về cùng một thực thể **. Vì vậy, bảng duy nhất ** được chuẩn hóa ** quá – zerkms

+0

Chính xác, tại sao thậm chí quan tâm đến việc đọc metas, khi bạn chỉ cần liệt kê từng bài một. – Starx

+0

@Starx: không đọc metas bằng cách chỉ định các trường chính xác bạn cần trong 'SELECT' – zerkms

2

Tôi nghĩ rằng chính hiệu suất về 'hiện đại' - Tôi không biết nhiều về ý nghĩa của 'hiện đại', nhưng - ứng dụng dựa trên RDBMS không chỉ phụ thuộc vào lược đồ cơ sở dữ liệu.

  • thiết lập cơ sở dữ liệu: ký ức chiến lược sử dụng, kích thước bộ đệm quan trọng, kích thước bộ nhớ cache truy vấn vv
  • phân phối trên dữ liệu/chế biến: phân vùng, xử lý lưới điện.
  • Chiến lược bộ nhớ cache: sử dụng công cụ bộ nhớ cache được nhúng hoặc khác (như memcached).
  • Hiệu suất phần cứng

Vì vậy, ước tính hiệu suất không phải là một vấn đề đơn giản. Ngay cả một bảng với 100 trường có thể được trang bị trong bộ nhớ, nhưng thậm chí cả hai trường-bảng có thể không được. Một truy vấn cho 5M hàng có thể được thực hiện dưới một phút, nhưng đôi khi cùng một truy vấn không kết thúc trong 10 phút trên 10M hàng (chỉ hai lần!) - nó phụ thuộc vào môi trường mà tôi đã đề cập ở trên.

Vì vậy, tôi nghĩ chúng tôi không thể chọn phương pháp hay nhất cho toàn bộ các trường hợp. Đối với ví dụ của bạn, chìa khóa được treo trên hương vị của DBA. (không đùa)

+0

Tôi không hiểu phần nào, 'chìa khóa bị treo trên mùi vị của DBA'. Vì nó không phải là một trò đùa, xin vui lòng giải thích – Starx

+1

Những bảng này sẽ không được tối ưu hóa tốt bằng cách chỉ 'chia', nói chung. Bởi vì sẽ chỉ có mối quan hệ 1: 1 giữa các bảng. Giới phân chia, tôi đồng ý với @TudorConstantin, nhưng tôi nghĩ rằng việc chia nhỏ bảng có thể thành 3 bảng hoặc 5 bảng hoặc 10 bảng không phải là vấn đề lớn đối với hiệu suất. Và ngoài ra, đây không phải là một cơ sở dữ liệu khổng lồ cho việc tổng hợp, bản đồ/giảm, phân tích hoặc ứng dụng giống như lưới, phải không? Vì vậy, tôi đã viết 'Đó là sở thích của DBA'. – lqez

Các vấn đề liên quan