2011-09-04 33 views
5

Tôi đang tìm cách tốt nhất để xử lý tình huống này. Tôi muốn lưu trữ một lịch biểu khấu hao bên trong một bảng dữ liệu. Mỗi hàng chứa ngày, số dư hiện tại, thanh toán, tiền gốc, lãi và số dư mới. Đối với một thế chấp 30 năm điển hình, đây sẽ là 360 hàng hoặc chèn cơ sở dữ liệu.Trong Delphi tôi có nên sử dụng nhiều cơ sở dữ liệu chèn từ bên trong một vòng lặp hoặc sử dụng một thủ tục được lưu trữ?

Tôi có nên thực hiện các phép tính bên trong vòng lặp bằng Delphi và thực hiện chèn cho mỗi kết quả hay tôi nên thực hiện các phép tính này bên trong một thủ tục lưu sẵn?

Đây sẽ là một người dùng, máy cục bộ, ứng dụng dành cho máy tính để bàn.

Trả lời

5

Tôi sẽ thực hiện các thao tác trong quy trình được lưu trữ. Bằng cách đó, làm việc với dữ liệu nằm trong cơ sở dữ liệu nơi nó thuộc về.

Ngoài ra, bằng cách giữ tất cả các hoạt động liên quan đến dữ liệu trong cơ sở dữ liệu, bạn tiết kiệm cho mình những rắc rối khi mã hóa lại nếu đôi khi trong tương lai bạn chọn chuyển ngôn ngữ.

+0

Tôi đến từ một thế giới của khách hàng bị khóa vào Oracle để DBMS thay đổi là bên cạnh không thể :) . IMHO, có tất cả các hoạt động liên quan đến dữ liệu (SELECT cho một, nhưng chủ yếu là các hoạt động cụ thể bao gồm sửa đổi một hoặc nhiều bảng) phải nằm trong cơ sở dữ liệu nơi chúng thuộc về. Lưu trữ các quy tắc nghiệp vụ trong cơ sở dữ liệu và hiển thị chúng thông qua các API tùy chỉnh. Phải thừa nhận rằng, điều này sẽ làm tăng đường cong học tập cho một lập trình viên có trách nhiệm nhưng tôi nghĩ nó đáng giá. Tôi thừa nhận điều này có thể đi xuống đến kích thước của ứng dụng và sở thích của những người đang làm việc trên nó :) – phil

+0

@Miho, vâng, nó là sở thích cá nhân, nhưng nó sẽ giết tôi nếu ai đó đã làm nó trên một trong các dự án của tôi. Đối với một nhà phát triển ứng dụng, việc sử dụng các thủ tục được lưu trữ là tổ của viper! Về cơ bản nó di chuyển các quy tắc dữ liệu ra khỏi phạm vi của nhà phát triển ứng dụng và đẩy chúng ra khỏi tầm nhìn.Tôi muốn biết những gì đang xảy ra với dữ liệu, không có nó xuất hiện bí ẩn đối với tôi. – Misha

+0

@Misha, tôi đồng ý với bạn về dữ liệu vừa xuất hiện. Những người làm việc với dữ liệu cần phải biết những gì và làm thế nào được lấy ra hoặc xử lý. Vấn đề là sự khác biệt giữa nhà phát triển ứng dụng và nhà phát triển cơ sở dữ liệu. Tôi không hiểu được thứ gì đó xuất hiện bí ẩn trong mã của bạn. Nếu chúng ta đặt một cái gì đó trong một thủ tục được lưu trữ, điều đó không có nghĩa là một nhà phát triển ứng dụng không thể định vị và sửa đổi/xem thủ tục đó? Nó chỉ thêm một mức trừu tượng khác. Chế độ xem tốt (mặc dù DB thiên vị): http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2143974700346554115 – phil

8

Truy vấn được chuẩn bị và quy trình được lưu trữ có thể so sánh hiệu suất một cách khôn ngoan. Là một nhà phát triển ứng dụng, tôi ghét các thủ tục được lưu trữ với một niềm đam mê bởi vì họ di chuyển logic từ bên trong ứng dụng, nơi tôi có thể tìm thấy nó, ở một nơi khác không thể nhìn thấy khi nhìn qua mã nguồn. Và chúng ta hãy đối mặt với nó, không ai sẽ tái phát triển một ứng dụng bằng một ngôn ngữ khác nếu nó hoạt động.

Vì vậy, nếu điều của bạn là cơ sở dữ liệu và SQL và bạn cảm thấy thoải mái với điều đó, thì thủ tục được lưu trữ là tốt. Tuy nhiên, nếu bạn chủ yếu là một nhà phát triển ứng dụng, tôi không thể thấy bất kỳ lợi ích nào của việc sử dụng các thủ tục được lưu trữ trên các truy vấn được thực thi từ mã.

+0

"Truy vấn được chuẩn bị" là gì và bạn sẽ sử dụng một ứng dụng như thế nào trong ứng dụng Delphi? –

+0

Truy vấn đã chuẩn bị là truy vấn được tham số hóa đã có tài nguyên "được phân bổ" (được chuẩn bị) trên máy chủ để có hiệu suất tốt hơn. Sau đó bạn có thể chạy cùng một truy vấn nhiều lần và nó chỉ là "thiết lập" (chuẩn bị) một lần trên máy chủ. Tìm một thuộc tính đã chuẩn bị trên các thành phần truy vấn bạn đang sử dụng (ADO, dbExpress, v.v.). – Misha

+1

Nếu dữ liệu nguồn đã có trong cơ sở dữ liệu và đích là Cơ sở dữ liệu giống nhau. Sau đó, một thủ tục lưu trữ là cách duy nhất để đi, nếu không bạn có hiệu suất mạng để trộn và làm chậm hoạt động. –

0

Nếu cơ sở dữ liệu của bạn là địa phương và bạn không thực hiện để làm cho nó khách hàng/máy chủ một ngày có thể có sự khác biệt nhỏ từ một quan điểm hiệu suất. Phần lớn phụ thuộc vào cơ sở dữ liệu bạn sử dụng. Một số có "mảng DML" cho phép bạn thực hiện tất cả các lần chèn 360 trong một chuyến đi cơ sở dữ liệu, thay vì thực hiện chèn 360 bạn điền vào các biến liên kết mảng và thực hiện chèn một lần. Cách tồi tệ nhất sẽ được sử dụng n chèn mà không có các biến ràng buộc. Mã Delphi được biên dịch và tối ưu hóa có thể hơi nhanh hơn mã thủ tục được lưu trữ giải thích, nếu cơ sở dữ liệu không biên dịch mã (một số có thể chỉ sử dụng Mã P). Từ quan điểm thiết kế, việc đặt logic dữ liệu bên trong DB xuất bản một loại API thông qua các thủ tục lưu sẵn (có thể cấm các cách khác để sửa đổi dữ liệu) có thể đảm bảo kiểm soát dữ liệu mạnh hơn.

2

Nếu bạn tình cờ sử dụng AnyDAC, nó hỗ trợ ArrayDML cho tất cả các cơ sở dữ liệu được hỗ trợ của họ. Tôi nghĩ đây là một tính năng tiện lợi. Đây là phần mềm thương mại, nhưng đầu tư rất tốt. (Tôi không liên quan đến chúng trong bất kỳ cách nào, trừ khi một khách hàng rất hài lòng.)

Xem Very High Performance using the Array DML

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