2008-08-11 40 views
7

Có nhiều cách để kết nối và tương tác với lớp cơ sở dữ liệu. Trong Java, ví dụ, tập quán phổ biến là JDBC các cuộc gọi của SQL thô, các trình ánh xạ quan hệ đối tượng, JDBCTemplate (Spring), các thủ tục được lưu trữ, v.v.Cách ưa thích của bạn trong việc tương tác với cơ sở dữ liệu từ ngôn ngữ lập trình của bạn là gì?

Trong ngôn ngữ của bạn, tùy chọn nào là sở thích của bạn và tại sao? Khi nào bạn sẽ cân nhắc những người khác?

Trả lời

4

ORM mọi lúc, ít nhất tôi phải suy nghĩ về cơ sở dữ liệu càng tốt.

+0

Điều gì sẽ xảy ra nếu bạn muốn đọc 10000 hàng từ cơ sở dữ liệu và lưu trữ tổng số ở đâu đó? Tại sao kéo tất cả những thứ đó qua mạng khi bạn có thể: chèn vào tổng số .. chọn từ chi tiết? –

+0

Với ORM, bạn không cần phải đọc 10000 hàng để có được tổng số. Ví dụ, trong LinqToSql có thể sử dụng phương thức Sum để tổng hợp một thuộc tính, sau đó được chuyển đổi thành SQL thích hợp cho phép máy chủ sql tính tổng mà không trả về tất cả các hàng. –

+0

@Ole: LinqToSql (chỉ hỗ trợ SQL Server, và có thể đã chết vì lợi ích của Entity Framework) vẫn là một hộp đen, tại sao không tự viết SQL? Và nếu bạn đặt logic tóm tắt trong một thủ tục được lưu trữ, bạn không cần phải cung cấp cho ứng dụng truy cập thô vào các bảng của bạn. – ObiWanKenobi

2

Tôi thích xây dựng một lớp mô hình đối tượng nghiệp vụ (đối tượng và collecitons của các đối tượng).

Tôi xây dựng khả năng tương tác với cơ sở dữ liệu vào từng đối tượng/bộ sưu tập (đối với SQL Server, tôi sử dụng System.Data.SqlClient). Tôi đã sử dụng mẫu này cho SQL Server, MySQL và Oracle.

Sau đó, tôi tương tác với các đối tượng từ mã ứng dụng của mình.

Bằng cách trừu tượng cơ sở dữ liệu của tôi thành các đối tượng, mã ứng dụng của tôi là nhất quán bất kể cơ sở dữ liệu phụ trợ.

2

LINQ là con đường để đi cho tôi từ đây trên

4

Tôi thực sự thích cách làm việc 3 + 1 tầng. Một cấp cho giao diện người dùng, một dành cho logic nghiệp vụ và để lưu trữ dữ liệu. Người cuối cùng bạn nói? Các đối tượng và giao diện miền. Điều này làm cho nó có thể tải lên bất kỳ một hoặc hai trong số các tầng chính cộng với tên miền "tầng" và mã sẽ hoạt động.

Nó dựa chủ yếu vào các nguyên tắc dependency injectionInversion of Control. Lớp dữ liệu/persistence chỉ có hai điều. Nó tạo, đọc, cập nhật và xóa dữ liệu và ánh xạ nó tới định dạng đối tượng miền.

Tầng UI ngược lại. Nó hiển thị và nhận dữ liệu theo cách mà người dùng có thể liên quan đến và ánh xạ đầu ra/đầu vào đó đến và từ định dạng đối tượng miền.

Cấp logic nghiệp vụ chỉ cần biết một điều. Logic nghiệp vụ. Nó không quan tâm đến dữ liệu đến từ đâu, và nó không quan tâm đến vị trí của tầng dữ liệu. Nó biết rằng nó nên gắn cờ một tài khoản mà chỉ là overdrawn, làm thế nào để thể chất làm điều đó không phải là một phần của công việc của mình thực sự.

Bản thân các đối tượng miền không có bất kỳ logic nào, chúng chỉ là các vùng chứa để truyền dữ liệu giữa các cấp. Điều này có nghĩa rằng bạn có thể tải các đối tượng miền và giao diện mà không cần phải suy nghĩ gì cả về các phụ thuộc.

Vào cuối ngày, tôi cảm thấy rằng tôi có một cơ sở mã khá rõ ràng với các tầng tách biệt rõ ràng. Và với một số giao diện nghiêm ngặt và các lớp cơ bản tốt nhất thì việc viết mã chỉ là nói cho phần mềm biết phải làm gì khi X xảy ra. Chỉ cần làm thế nào nó được cho là.

</rant> 

Edit: Oh, yeah. Điều này đúng cho cả LINQ, SubSonic và các ORM khác.

1

ORM thực sự tuyệt vời.

Tôi sử dụng thuật giả kim thuật SQL khi làm việc trong python - nó hoạt động với mọi DBMS mà tôi đã chạy qua.

Đối với các ứng dụng hướng dữ liệu nhẹ trên MacOS X, tôi sử dụng Dữ liệu lõi, có công cụ tạo mô hình dữ liệu tuyệt vời có thể truy cập thông qua Xcode.

Cả hai điều này cho thấy rằng ORM thực hiện đúng là tuyệt vời. Tôi đã có ít thành công và thích thú hơn với EJB.

1

Tôi chưa tham gia vào thế giới LINQ, nhưng tôi đã thực sự yêu thích các lớp DataTable/TableAdapter mà Visual Studio đã thực hiện bằng phương tiện của một tập dữ liệu XSD. Bằng một vài thao tác kéo và nhấp chuột sau khi tạo lược đồ cơ sở dữ liệu của tôi, bây giờ tôi có một đối tượng DataSet/DataTable được gõ mạnh và tôi có các phương thức bộ điều hợp đang sử dụng các truy vấn parametrized cho các thủ tục được lưu trữ cho tất cả các câu lệnh CRUD của tôi. Nó thậm chí sẽ tạo ra các bộ điều hợp bảng truy vấn cho một số các thủ tục không được gắn trực tiếp với một bảng.

Ồ, và nếu bạn chưa tạo các thủ tục được lưu trữ và chỉ có các bảng, trình hướng dẫn sẽ tạo các thủ tục hoặc các câu lệnh SQL adhoc cho bạn.

Điều này đã xảy ra kể từ Visual Studio 2005 và đã giảm đáng kể thời gian "cấu trúc" của tôi với các ứng dụng web mới của tôi và tôi có thể tập trung nhiều hơn vào logic kinh doanh và bản trình bày.

0

Trong C# I love LINQ to SQL cho bất cứ điều gì mới, nhưng tôi thực sự thích sử dụng .netTiers + CodeSmith Generator để có được một lớp dữ liệu nhanh chóng và bẩn đến cơ sở dữ liệu xảy ra nếu tôi đang sử dụng C# trên .NET 2.0.

3

Ruby on Rails 'ActiveRecord lau sàn nhà với mọi thứ khác mà tôi đã nhìn thấy từ trước tới nay. LINQ có vẻ như nó có thể tốt hơn trong một số trường hợp, nhưng ActiveRecord rất linh hoạt.

0

Tôi thích Hibernate rất nhiều :)

Tôi biết nó có một đường cong học tập, nhưng một khi bạn đã nắm vững nó, nó khá tốt đẹp.

Không cần phải nói, tôi không thể chờ đợi để có được bàn tay của tôi trên mới Entity Framework trong .NET 3.5 SP1 (Tôi biết nó đã có sẵn, nhưng tôi một chút lười biếng gõ XML :))

0

ActiveRecord , đó là một mẫu được ghi lại đầu tiên (tôi nghĩ) trong số Patterns of Enterprise Architecture của Fowler. Tôi tin rằng nó được thực hiện bằng các ngôn ngữ khác ngoài Ruby, mặc dù nó được biết đến như một công nghệ cốt lõi trong Rails. Dù sao, nó là một sự trừu tượng gọn gàng của cơ sở dữ liệu, mặc dù tôi phải thú nhận rằng tôi thấy nó hơi clunky và trong khu vực find_by_sql. Nhưng đó có thể chỉ là tôi.

Nhưng bây giờ, tất cả các ORM trên thế giới không thay thế cho một kiến ​​thức tốt về SQL, mà không thực sự tôi không muốn thấy quyền truy cập vào RDBMS được cho phép.

0

Hiện tại chúng tôi đang sử dụng ODAC để nói chuyện với cơ sở dữ liệu Oracle và sử dụng rất nhiều gói Oracle (PL/SQL). Hệ thống n-tier được thực hiện thông qua RemObjects có nghĩa là khách hàng của chúng tôi không có SQL trong bất kỳ điều gì và chỉ cần có khả năng gửi các yêu cầu HTTP để không cần phải cài đặt.

Tất cả điều này được thực hiện bằng cách sử dụng Borland Delphi và đã được woking trong 2 năm trong một môi trường sản xuất.

1

Chúng tôi sử dụng một cách tiếp cận khác nhau, tùy thuộc vào những gì sẽ phù hợp với tình hình cụ thể trong ứng dụng:

  • Khi đọc một giá trị trang thông tin để hiển thị và cho một người sử dụng để cập nhật chúng tôi sử dụng Hibernate
  • Khi xử lý một loạt các cập nhật hoặc tóm tắt nơi hầu hết dữ liệu đã có trong cơ sở dữ liệu (ví dụ: xử lý cuối ngày), chúng tôi sử dụng PL/SQL (và cố gắng suy nghĩ theo nhóm)
  • Khi người dùng thực hiện tìm kiếm hoặc chạy báo cáo tóm tắt, chúng tôi sử dụng sqlmaps ibatis để xây dựng một số SQL và chỉ mang lại các trường mà chúng tôi quan tâm (không t mỗi cột và chắc chắn không phải bất kỳ hàng trẻ không cần thiết, urggh)
  • Bất cứ điều gì đó thực sự có để chạy nhanh, chúng tôi sẽ sử dụng bất cứ phương pháp hiệu quả nhất

Đây là với java/Oracle.

0

Chúng tôi sử dụng Delphi và Oracle Data Access Components (ODAC) và ADO thông qua Oracle.OleDBProvider.

0

Cách yêu thích có thể là sử dụng Smalltalk với kho lưu trữ đối tượng GemStone. Tại sao? Không có vấn đề ORM để giải quyết. Tôi sẽ chỉ xem xét điều gì khác nếu bị chủ nhân của tôi ép buộc hoặc đe dọa.

0

Cách yêu thích của tôi là có lớp trừu tượng đối tượng. Lý tưởng nhất, đây là chỉ địa điểm hoạt động với SQL. Nhưng trong thực tế, các đối tượng đôi khi cũng cần phải làm những điều SQL-y. Nhưng không có gì ngoài đối tượng.

Cho đến nay, tôi đã tự viết các lớp như vậy vì những gì đã có sẵn quá lúng túng, quá chậm hoặc quá lớn.

0

Tôi sử dụng JDBC đơn giản vì tôi đang phát triển một ứng dụng hướng dữ liệu và mô hình cơ sở dữ liệu của tôi rất phức tạp. Mọi thứ được mô tả trong cơ sở dữ liệu, thậm chí cấu trúc của các bảng khác. Thêm vào đó tôi sử dụng các thủ tục lưu trữ rất nhiều. Do đó ORM không phải là một lựa chọn cho tôi.

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