Khi nào thì giảm tải công việc cho RDBMS hơn là thực hiện mã?


12

Được rồi, tôi sẽ xử lý nó: Tôi là một lập trình viên giỏi hơn tôi ở cơ sở dữ liệu và tôi tự hỏi những suy nghĩ về "thực tiễn tốt nhất" nằm ở đâu trong chủ đề thực hiện các phép tính "đơn giản" trong truy vấn SQL so với mã, chẳng hạn như ví dụ về MySQL này (Tôi không viết nó, tôi chỉ phải duy trì nó!) - Điều này trả về tên người dùng và tuổi người dùng kể từ sự kiện cuối cùng.

SELECT u.username as user, 
       IF ((DAY(max(e.date)) - DAY(u.DOB)) < 0 ,   
       TRUNCATE(((((YEAR(max(e.date))*12)+MONTH(max(e.date)))
       -((YEAR(u.DOB)*12)+MONTH(u.DOB)))-1)/12, 0),  
       TRUNCATE((((YEAR(max(e.date))*12)+MONTH(max(e.date))) -            
       ((YEAR(u.DOB)*12)+MONTH(u.DOB)))/12, 0)) AS age   
FROM users as u
JOIN events as e ON u.id = e.uid
...

So với việc nâng "nặng" trong mã:

Truy vấn:

SELECT u.username, u.DOB as dob, e.event_date as edate
FROM users as u
JOIN events as e ON u.id = e.uid

mã:

function ageAsOfDate($birth, $aod)
{    //expects dates in mysql Y-m-d format...
     list($by,$bm,$bd) = explode('-',$birth);
     list($ay,$am,$ad) = explode('-',$aod);

     //Insert Calculations here 
     ...
     return $Dy; //Difference in years
}

echo "Hey! ". $row['user'] ." was ". ageAsOfDate($row['dob'], $row['edate']) . " when we last saw him."; 

Tôi khá chắc chắn trong một trường hợp đơn giản như thế này, nó sẽ không tạo ra nhiều khác biệt (ngoài cảm giác rùng rợn khi tôi phải thay đổi các truy vấn như lần đầu tiên), nhưng tôi nghĩ nó làm cho nó rõ ràng hơn những gì tôi ' m đang tìm kiếm.

Cảm ơn!


1
Đây là một câu hỏi hay - tôi đã gặp vấn đề tương tự.
Michael K

Đây là một ví dụ điển hình khi không nên làm điều đó: calendar.sql (Vâng, đó là sự quái dị của tôi, vâng, đó là một ý tưởng tồi, và không, nó không chậm.)
greyfade

Các vị thần lật kèo ... Tôi đặt cược MD5 cho thứ đó xuất hiện là "CthulhuFhtagn"
GeminiDomino

Câu trả lời:


13

Bạn muốn thực hiện tất cả các hoạt động dựa trên thiết lập trong cơ sở dữ liệu vì lý do hiệu suất. Vì vậy, chức năng tổng hợp, chức năng sắp xếp, tham gia, vv

Tính toán tuổi này, tôi sẽ làm trong mã. Lý do duy nhất tôi có thể làm một cái gì đó như thế này trong truy vấn cơ sở dữ liệu là nếu nó yêu cầu nhiều cột mà tôi không chọn có thể thực sự có thể đủ lượng dữ liệu để làm chậm truy vấn của tôi. Chọn một vài giá trị số nguyên sẽ không tạo ra sự khác biệt hiệu suất có ý nghĩa. Và ngay cả khi nó tạo ra sự khác biệt hiệu suất vừa phải, tôi sẽ thiên về việc giữ logic này trong mã ứng dụng.


Tôi đồng ý. Mã thay đổi giá trị cho mục đích hiển thị phải có trong mã ứng dụng của bạn.
TehShrike

4

Mỗi trường hợp là khác nhau

Là logic ...

  • khách hàng khác cần thiết? DRY: trong cơ sở dữ liệu
  • dùng để chế biến thêm? ví dụ: sắp xếp theo độ tuổi giảm dần: trong cơ sở dữ liệu
  • yêu cầu thiết lập khu vực? dd / mm / yyyy hoặc mm / dd / yyyy: trong máy khách
  • sử dụng thường xuyên? Tại sao phải tính toán nó nhiều lần: sử dụng cột được tính toán và duy trì trong cơ sở dữ liệu

Trong này trường hợp, tôi có thể sử dụng một cột tính toán và tiếp tục tồn tại trong cơ sở dữ liệu

Nó có thể tệ hơn: bạn có thể có cái này trong cơ sở dữ liệu:

"Hey! ". u.username." was ". <datecalc>. " when we last saw him."

3

Về cơ bản, bạn nên xem xét hai điều: sử dụng CPU và lưu lượng mạng. Bạn không nên tạo ra các phản hồi to lớn, chuyển chúng qua mạng và sau đó tóm tắt trong frontend, vì cơ sở dữ liệu có thể làm điều này tốt hơn nhiều.

Đối với thao tác dữ liệu, đó là một sự đánh đổi. Nếu cơ sở dữ liệu dành số lượng chu kỳ cpu tương đương cho mã frontend của bạn làm điều tương tự - với điều kiện là lượng dữ liệu được truyền gần tương đương), thì nó không thành vấn đề. Sau đó làm điều đó khi bạn có số lượng chuyên môn lập trình lớn nhất. Thường xuyên, bạn có thể có được một chặng đường RẤT lâu dài với một lựa chọn cẩn thận và điều đó có thể rất hữu ích.


1

Bạn đã đề cập đến một: lĩnh vực chuyên môn. Có thể cấu trúc của cơ sở dữ liệu không quá chuyên sâu, vì vậy bạn quyết định giảm tải một số phát triển logic cho một thành viên trong nhóm là trung tâm cơ sở dữ liệu hơn. Có thể không lý tưởng, nhưng nếu bạn bị khủng hoảng thời gian ...

Phần cứng cơ sở dữ liệu có nhiều tài nguyên hơn đáng kể so với các máy chủ khác và bạn không thể thay đổi điều này. Điều này có thể không áp dụng cho tình huống cụ thể này, nhưng có thể cần phải được xem xét.

Có những ứng dụng khác có thể cần logic bên ngoài mã của bạn. Một số công cụ viết báo cáo có thể không sử dụng được dịch vụ web hoặc API. Bạn có thể nhân đôi logic hoặc nếu bạn cảm thấy các yêu cầu có thể phân kỳ.


"Phần cứng cơ sở dữ liệu có nhiều tài nguyên hơn đáng kể so với các máy chủ khác và bạn không thể thay đổi điều này." -- Hở? Hai tuyên bố đó đến từ đâu?
Peter Boughton

Tôi nghĩ Jeff có thể đang nói về các máy chủ Cơ sở dữ liệu độc lập. Tôi có lẽ nên chỉ định rằng tôi làm việc chủ yếu trên các thiết lập P [MP] LA.
GeminiDomino

1
Thiết lập LAMP không có lý do gì để không có máy chủ cơ sở dữ liệu độc lập và máy chủ cơ sở dữ liệu độc lập cũng không đảm bảo nhiều tài nguyên hơn cũng như không thể thay đổi điều này.
Peter Boughton

Hrm. Không chắc rồi.
GeminiDomino

@Peter Boughton, DB và ứng dụng trong cùng một máy chủ có thứ tự thời gian ít hơn cho kết nối giao diện và cường độ IO lớn hơn trong suốt, có những lý do thực sự để xác định hai thứ này với nhau.
Jé Queue

0

Tôi luôn luôn sai lầm khi đặt quá nhiều xử lý tại DB. Cú pháp của bạn ở trên cũng có thể được viết bằng các hàm DB sẽ là IMO một giải pháp rất rõ ràng.

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.