Tại sao các tính năng cơ sở dữ liệu bị bỏ qua và thay vào đó được phát minh lại ở tầng giữa?


83

Những lý do hàng đầu ( ngoài "tính độc lập cơ sở dữ liệu" ) mà hầu hết các dự án CNTT ngày nay dường như bỏ qua sự phong phú của các tính năng tồn tại trong các công cụ cơ sở dữ liệu hiện đại như Oracle 11g và SQL Server 2008?

Hoặc, mượn từ blog Tuyên bố Helsinki, viết theo cách này:

Trong hai mươi năm qua, chúng tôi nhận thấy rằng chức năng (tính năng) có sẵn cho chúng tôi bên trong DBMS, đã phát triển theo cấp số nhân. Những tính năng này cho phép chúng tôi xây dựng các ứng dụng cơ sở dữ liệu. Đó là những gì tất cả chúng ta bắt đầu làm trong những năm 90 bùng nổ.

Nhưng rồi vào buổi bình minh của thiên niên kỷ mới, một điều gì đó đã xảy ra. Và điều gì đó bí ẩn đã làm cho vai trò của DBMS bên trong một dự án ứng dụng cơ sở dữ liệu giảm xuống không đáng kể. (...) Kể từ thiên niên kỷ mới, chúng tôi đang đẩy tất cả logic ứng dụng ra khỏi DBMS vào các máy chủ cấp trung bình. Chức năng của những thứ được triển khai bên ngoài DBMS đã bùng nổ và DBMS có nhiều tính năng hầu như không được sử dụng cho bất cứ thứ gì ngoài lưu trữ hàng.

Chúng ta đang nói về những thứ như

  • Các quy trình đã lưu trữ được sử dụng làm API dữ liệu (để bảo mật và tránh lưu lượng mạng quá mức)
  • Chế độ xem cụ thể hóa
  • Thay vì kích hoạt
  • Truy vấn phân cấp (kết nối bằng)
  • Địa lý (kiểu dữ liệu không gian)
  • Phân tích (khách hàng tiềm năng, độ trễ, tổng hợp, khối lập phương, v.v.)
  • Cơ sở dữ liệu riêng ảo (VPD)
  • Kiểm toán cấp cơ sở dữ liệu
  • Truy vấn hồi tưởng
  • Tạo XML và chuyển đổi XSL trong cơ sở dữ liệu
  • Chú thích HTTP từ cơ sở dữ liệu
  • Trình lập lịch công việc nền

Tại sao những tính năng này không được sử dụng? Tại sao hầu hết các nhà phát triển Java, .NET và PHP lại gắn bó với cách tiếp cận "CHỌN * TỪ mytable"?


13
+1 người nói chuyện tốt đẹp.
Dan Rosenstark

bạn có thể đăng bài này làm câu hỏi mẫu cho đề xuất Tham gia bên ngoài không: area51.stackexchange.com/proposal/4260/outer-join (Tôi muốn làm điều đó và cung cấp ghi nhận tác giả, nhưng tôi đã ở giới hạn 5 câu hỏi của mình)
Joe

Câu trả lời:


55

Bởi vì các thủ tục được lưu trữ:

  • thêm một ngôn ngữ phát triển khác, làm tăng độ phức tạp và mã có khả năng dư thừa (logic được viết bằng cả hai ngôn ngữ);
  • thường có khả năng tạo công cụ, giám sát và gỡ lỗi kém hơn PHP, C #, Java, Python, v.v.;
  • thường ít khả năng hơn hầu hết các ngôn ngữ bậc trung;
  • chỉ có lợi thế khi chuyển đổi dữ liệu khối lượng lớn (nơi bạn tránh máy chủ quay vòng), có xu hướng chỉ sử dụng thực tế ở mức tối thiểu.

Điều đó đang được nói, đó là một phương pháp phổ biến trên các ứng dụng C # ASP.NET.

Như Jeff Atwood đã nói, các thủ tục được lưu trữ là ngôn ngữ hợp ngữ của cơ sở dữ liệu và mọi người không có xu hướng viết mã bằng hợp ngữ trừ khi họ cần.

Tôi thường xuyên sử dụng các khung nhìn cụ thể hóa và đôi khi sử dụng CONNECT BY trong Oracle, cả hai đều không tồn tại trong MySQL.

Tôi không có xu hướng sử dụng XML / XSLT trong cơ sở dữ liệu bởi vì, điều đó có nghĩa là tôi đang sử dụng XML và XSLT.

Đối với cấu trúc dữ liệu địa lý hoặc không gian, lý do có lẽ là chúng khó "thu nhận". Đó là một khu vực khá chuyên biệt. Tôi đã đọc hướng dẫn sử dụng MySQL về cấu trúc dữ liệu không gian và tôi chắc rằng nó có ý nghĩa đối với một người có kinh nghiệm GIS sâu rộng nhưng đối với tôi và nhu cầu hạn chế của tôi (có xu hướng đánh dấu vĩ độ / kinh độ của một điểm) thì nó không Có vẻ không đáng để đầu tư thời gian để tìm ra nó.

Một vấn đề khác là nếu bạn vượt ra ngoài ANSI SQL (nhiều) thì bạn chỉ bị ràng buộc phần nào với một nhà cung cấp cơ sở dữ liệu cụ thể và có thể với một phiên bản cụ thể. Vì lý do đó, bạn thường thấy các nhà phát triển ứng dụng sẽ có xu hướng coi cơ sở dữ liệu của họ ở mẫu số chung thấp nhất, có nghĩa là coi chúng như một bãi chứa dữ liệu quan hệ.


34
Tôi muốn nói thêm rằng các thủ tục được lưu trữ hiếm khi được đặt dưới sự kiểm soát của nguồn.
MusiGenesis 02/09/09

19
Chà, điều đó có thể đúng nhưng không có lý do gì chúng không được kiểm soát nguồn.
cletus 02/09/09

4
Tất cả SPS của chúng tôi là dưới sự kiểm soát nguồn, đó là một cái cớ không phải là một lý do
HLGEM

5
@Aric TenEyck: Các tệp thực thi của bạn có được kiểm soát nguồn không? Không phải một số tệp văn bản ngẫu nhiên (hy vọng) có chứa mã nguồn mới nhất cho chúng, nhưng các chương trình được biên dịch thực tế đang được kiểm soát nguồn? Vấn đề là, miễn là bạn có quy trình triển khai và kiểm soát nguồn tốt, thì việc giữ các tệp .sql trong kiểm soát nguồn là hoàn toàn đủ. Tất nhiên, như với bất kỳ quy trình nào, điều đó có nghĩa là các nhà phát triển cần phải tiếp cận với chương trình, nhưng đó không phải là vấn đề cụ thể đối với cơ sở dữ liệu hoặc mã SQL.
Daniel Pryden 02/09/09

8
Tôi đồng ý với các SP "có lợi thế hơn với việc chuyển đổi dữ liệu khối lượng lớn (nơi bạn tránh được máy chủ quay vòng)". Tuy nhiên, sau đó bạn nói rằng "có xu hướng chỉ là mức sử dụng thực tế tối thiểu". Tôi nghĩ đó là mấu chốt của cuộc tranh luận: nếu bạn có một ứng dụng mà việc chuyển đổi dữ liệu khối lượng lớn là mức sử dụng tối thiểu, thì việc thêm nhiều chức năng cơ sở dữ liệu là không đáng. Tuy nhiên, nếu bạn có hơn một tỷ bản ghi trong một bảng và bạn cần chọn 24 trung bình trượt 8 giờ trong 0,1 giây, thì cơ sở dữ liệu bắt đầu là giải pháp tốt hơn nhiều. Câu trả lời đúng thực sự phụ thuộc vào ứng dụng của bạn.
Daniel Pryden 02/09/09

36

Bởi vì các nhà phát triển không biết về SQL. Chúng dựa trên DDL và DML được tạo bởi các công cụ như Hibernate và các cấu trúc cấp độ ngôn ngữ như chú thích JPA. Các nhà phát triển không quan tâm liệu những thứ này có kém hiệu quả kinh khủng hay không vì chúng bị ẩn một cách nhân hậu bởi các cấp nhật ký bình thường và vì DBA không thuộc nhóm phát triển.

Đó là lý do tại sao tôi thích công cụ iBATIS . Chúng giúp bạn viết và hiểu SQL, bao gồm các tính năng cụ thể của DBMS.


vì vậy tôi đã xem liên kết của bạn. . . iBATIS có phải là ORM không? Bạn chỉ cần xác định một công cụ thay vì có một công cụ làm việc đó cho bạn?
andrewWinn 02/09/09

4
Không, iBATIS không phải là ORM, nó là một trình ánh xạ truy vấn . Nó không ánh xạ các đối tượng trên bảng mà là các truy vấn trên bất kỳ cấu trúc ngôn ngữ nào, đối tượng hay không.

vì vậy bạn cho nó biết những đối tượng nào (kết quả truy vấn và những gì không), thay vì để nó làm điều đó cho bạn?
andrewWinn 02/09/09

3
+1 cho "vì nhà phát triển không biết về SQL" và "vì DBA không thuộc nhóm phát triển". Chúng tôi có chuyên gia về DBA / cơ sở dữ liệu trong nhóm của mình và chúng tôi chắc chắn sử dụng nhiều tính năng cơ sở dữ liệu hơn hầu hết. Điều đó nói rằng, tôi chưa bao giờ nghe nói về iBATIS trước đây. Thoạt nhìn, nó trông không ấn tượng lắm, nhưng tôi sẽ tập hợp lại để xem xét sau.
Daniel Pryden 02/09/09

3
@andrewWinn: Toàn bộ điểm là bạn có thể sử dụng cơ sở dữ liệu cho nhiều hơn các hàm CRUD.
Daniel Pryden 02/09/09

21

Tôi đoán một lý do là sợ nhà cung cấp khóa.

Điều này không được nói thường xuyên, nhưng lợi ích của việc sử dụng các tính năng dành riêng cho nhà cung cấp cần được cân nhắc với chi phí. Chủ yếu là chi phí của việc phải viết lại các phần dựa vào các tính năng dành riêng cho nhà cung cấp cho mọi cơ sở dữ liệu bạn muốn hỗ trợ. Ngoài ra còn có chi phí hiệu suất nếu bạn thực hiện một cái gì đó theo cách có mục đích chung khi nhà cung cấp cung cấp một cách tốt hơn.

Tôi sẽ đưa ra ví dụ này: người ta có thể thấy "lockin" của SQL Server dễ chấp nhận hơn khi người ta nhận ra tất cả những thứ Dịch vụ phân tích, Dịch vụ báo cáo, v.v. có thể làm cho ứng dụng của bạn. Đối với các hệ thống cơ sở dữ liệu thương mại lớn, không chỉ "chỉ" công cụ cơ sở dữ liệu SQL mới cần được tính đến.


7
Nhiều nhà cung cấp khóa ORM hơn so với cơ sở dữ liệu. Rất hiếm khi cần thay đổi cơ sở dữ liệu, đặc biệt là đối với các ứng dụng dựa trên web.
HLGEM

1
Tôi không đồng ý. Tôi đã tham gia vào một số dự án mà chúng tôi đã tiến rất xa với MySQL. Sau đó, chúng tôi biết được rằng máy khách có một số giao thức nội bộ khó hiểu yêu cầu một số dữ liệu quan trọng nhất định phải được lưu trữ trong Oracle DB. Bạn có thể lập luận rằng điều này nên được gọi ra trong các yêu cầu ban đầu. Nhưng trên thực tế, điều này xảy ra và nó có thể là một sự tiêu hao rất lớn cho một dự án.
Marco

5
@Marco: MySQL là đối với Oracle vì súng đồ chơi của trẻ con dành cho toàn bộ quân đội Hoa Kỳ. Có nghĩa là, thứ nhất là hoàn toàn phù hợp để chơi với và miễn phí, trong khi thứ hai thực sự có thể bảo vệ bạn, nhưng rất đắt và đi kèm với rất nhiều yêu cầu khác. Tôi đoán bình luận của bạn không có ý nghĩa đối với tôi. Bạn có thể đã đi được bao xa với MySQL? Bạn đang sử dụng tính năng nào trong MySQLOracle không có?
Daniel Pryden 02/09/09

4
Nhận xét của tôi không nhất thiết về các tính năng. Đối với một tính năng cụ thể mà chúng tôi đang sử dụng, ngay cả khi Oracle có nó, nó hoạt động theo cách khác. Trong cú pháp nếu không có gì khác (và thường nhiều hơn thế). Vì vậy, tất cả những thứ đó phải được chuyển và kiểm tra lại. Lập luận ở đây là về chi phí di chuyển là quan trọng, tuy nhiên bạn nhìn vào nó. Bạn có đang gợi ý rằng mọi người đều nên sử dụng Oracle để tất cả các cơ sở của họ được bảo vệ không? <- Đó không phải là khó khăn. Bạn có gì chống lại việc chọn một db đơn giản cho những gì nên là một dự án đơn giản?
Marco

17

"Tại sao các tính năng cơ sở dữ liệu bị bỏ qua".

Bởi vì rất nhiều nhà phát triển được gọi là hoàn toàn không biết gì về quản lý dữ liệu, và điều tệ hơn là họ cũng hoàn toàn không biết gì về sự thiếu hiểu biết của mình. "Không có kỹ năng và không biết về nó", điều này rung chuông cho ai.


1
Tôi biết một số nhà phát triển, và tôi không thực sự là một người năng động, tôi chủ yếu làm việc với cơ sở dữ liệu không gian (mô hình hóa / dba), nhưng điều đó là đúng. Các nhà phát triển dường như không biết rằng việc tạo và duy trì một cơ sở dữ liệu dễ sử dụng, thông thạo là một nhiệm vụ phức tạp.
George Silva

12

Nếu phần mềm của bạn chạy trên phần cứng của máy khách thì bất kỳ thay đổi nào đối với cơ sở dữ liệu (Thủ tục được lưu trữ mới, dạng xem cập nhật, v.v.) sẽ yêu cầu quyền quản trị viên DB. Đây gần như luôn là một vấn đề đối với khách hàng. Tham gia vào nhóm DB sẽ làm phức tạp bất kỳ cập nhật nào bạn cần thực hiện. Có rất nhiều lý do tuyệt vời được trình bày ở đây, nhưng đây là lý do duy nhất tôi cần để tránh đưa mã vào cơ sở dữ liệu như bệnh dịch.


1
Tôi đã xem một số dự án, nơi mà vấn đề này được nhận ra quá muộn. Ngay sau khi ứng dụng được đưa ra, cơ sở dữ liệu sẽ trở thành một gánh nặng lớn. Mô hình dữ liệu giữa cơ sở dữ liệu và thế giới đối tượng bắt đầu tách rời. Những cách giải quyết tồi tệ được đưa vào sản xuất. Các lỗi liên quan đến cơ sở dữ liệu lần lượt xuất hiện. Một mớ hỗn độn chồng chất.
Theo Lenndorff, 12/09/09

10

Tôi đoán một lý do là sợ nhà cung cấp khóa. Các tính năng DBMS này không được tiêu chuẩn hóa - ví dụ, các thủ tục được lưu trữ rất đặc trưng cho DB và nếu bạn triển khai nội dung bằng các thủ tục được lưu trữ (thay vì, chẳng hạn, các dịch vụ web được hiển thị qua một tầng trung gian), thì bạn sẽ mãi mãi bị mắc kẹt với DBMS được chọn đầu tiên , (nghĩa là, trừ khi bạn sẵn sàng dành thời gian / tiền bạc để triển khai lại nó trong một DBMS khác nếu bạn muốn thay đổi DBMS).


17
Tôi chưa bao giờ tham gia một dự án mà RDMS đã chọn đã được thay đổi sau đó.

2
thậm chí thay đổi từ phiên bản này sang phiên bản khác có thể gây ra các thay đổi vi phạm.
andrewWinn

1
@lutz: đó là vì những gì andrewWinn nói - ngay cả một thay đổi duy nhất cũng có thể phá vỡ mã cũ, vì vậy cách tốt nhất, an toàn nhất là không thay đổi. Do đó, không ai sẵn sàng thay đổi RDBMS của họ. Nhưng điều đó có nghĩa là bạn không muốn phải dựa vào RDBMS của mình vì nếu nó được phát hiện là bị thiếu, thì tất cả các proc được lưu trữ tùy chỉnh của bạn hoặc những dịch vụ trên đó sẽ cần được thực hiện lại hoặc chuyển. Do đó, quan điểm của tôi - RDBMS không cung cấp một cách đáng tin cậy để các dịch vụ như proc được lưu trữ được giao tiếp theo cách tương thích ngược.
Chii 02/09/09

1
@lutz: Tôi đã gặp phải trường hợp chúng tôi đã thay đổi DB. (chúng tôi đã đạt đến kích thước bảng tối đa trong bản cài đặt Oracle 8 hơn 10 năm tuổi và không có tiền để nâng cấp DB, phải di chuyển ... điều đó có nghĩa là thực hiện lại mọi thứ.) Chúng tôi có thể đã dành nhiều giờ làm việc hơn những gì nó 'd có chi phí cho một giấy phép Oracle, nhưng chúng đã được ngân sách cho.
Joe

2
@lutz: amen. Xây dựng một hệ thống để xử lý cơ sở dữ liệu chuyển đổi thương hiệu là một trường hợp cổ điển của "đặt trước ý chí", ngoại trừ nó giống như "đặt sẽ không trước ý chí".
MusiGenesis 02/09/09

8

MySQL.

Khi các ứng dụng web bùng nổ vào cuối những năm 1990 và đầu những năm 2000, MySQL ở phiên bản 3.3 hoặc 4.0 và không hỗ trợ bất kỳ thứ gì trên SELECTcác s đơn giản . Tuy nhiên, nó miễn phí và được cài đặt với hầu hết các bản phân phối Linux. Kết quả là, một thế hệ lập trình viên đã không học về cơ sở dữ liệu và không biết cách sử dụng chúng.

Ngay cả bây giờ MySQL ở mức 5.1 và hỗ trợ hầu hết các tính năng của một hệ thống thương mại, các blog và bài báo cũ tương tự được sử dụng làm mẫu khi một dự án LAMP mới được khởi động và MySQL được triển khai với các bảng MyISAM và chức năng của kỷ nguyên 3.3 .


6
+1. MySQL gây hại nhiều hơn lợi - cho cả danh tiếng của cơ sở dữ liệu nói chung và các lập trình viên sử dụng nó.
Daniel Pryden

Đồng ý - Tôi thực sự đã làm điều này, bắt đầu với MySQL và chỉ sau này lấp đầy bằng cách hệ thống cơ sở dữ liệu THỰC SỰ có thể làm được bao nhiêu việc khác (các mối quan hệ khóa ngoại? Phân tầng xóa? Kích hoạt? Chỉ mục duy nhất? Ràng buộc?).
Keith Williams

7

SQL bị lỗi vì lý do tương tự như Haskell. Thước đo quyết định sự thành công của ngôn ngữ không phải là sự thuần khiết, không phải là sự dễ hiểu của máy tính mà là mức độ khó duy trì các chương trình được viết trong đó.

Chỉ có những con người thất bại với ngay cả ngôn ngữ đơn giản nhất. Có lẽ cứ 10 người thì có 1 người có kỹ năng sử dụng một ngôn ngữ đơn giản như C #. Nhưng trong số 10% đó, chỉ có 1/10 hoặc 1% tổng số người có thể sử dụng hiệu quả các ngôn ngữ như SQL hoặc Haskell.

Bây giờ, SQL là một ngôn ngữ chưa hoàn chỉnh, theo nghĩa là có rất ít thứ bạn có thể làm chỉ với SQL. Bạn sẽ luôn cần một ngôn ngữ khác. Điều đó để lại vai trò gì cho SQL? Các nhà phát triển sẽ hiểu lợi thế của ACID so với lưu trữ tệp phẳng, nhưng bên cạnh đó cơ sở dữ liệu thực sự không có gì để cung cấp cho chúng.

Một vấn đề thứ hai là SQL hiệu quả không tương thích nhiều với Phiên bản nguồn. SQL dường như thực sự được xây dựng dựa trên quan điểm rằng bạn sẽ hiểu đúng ngay lần đầu tiên. Vì vậy, nó không chỉ không phù hợp với các nhà phát triển mà còn không phù hợp với quá trình phát triển.


điểm tốt. Tôi luôn tự hỏi tại sao những SP đó lại nằm trong cơ sở dữ liệu của friggin ', không thể đảo ngược. Tại sao không có chúng trong các tệp văn bản bên ngoài, có thể với tùy chọn bộ nhớ cache? Ngoài ra, đúng về mức độ khó của SQL. SQL là thứ freaky: thay vì hỏi các ứng cử viên cuộc phỏng vấn về vs bên ngoài bên tham gia, tôi muốn hỏi về những thứ có ý nghĩa :)
Dan Rosenstark

13
Wow, chính xác là sai. SQL là một thứ tự về độ lớn dễ học và dễ sử dụng (và sử dụng tốt) hơn C # hoặc bất cứ thứ gì sử dụng .Net. Hầu hết các lập trình viên không cố gắng nữa.
RBarryYoung 02/09/09

12
SQL có cú pháp khai báo, COBOL là thủ tục, vì vậy "dữ kiện" của bạn là yếu. Tôi đã học hơn 30 ngôn ngữ khác nhau và SQL không nghi ngờ gì là một trong những ngôn ngữ dễ học nhất, nhiều nghiên cứu vào thời điểm nó cũng được tạo ra để hỗ trợ điều này (và các ngôn ngữ khai báo nói chung, dễ học hơn các ngôn ngữ bắt buộc) . .Net rằng có useability như một mối quan tâm không giảm thực tế là bất kỳ API w 20k + điểm vào mất một thời gian đáng kể để tìm hiểu và được in thành thạo.
RBarryYoung

1
RBarry Young, Tôi muốn upvote bình luận của bạn một triệu lần nếu tôi có thể
HLGEM

1
LuckyLindy - Điều này chủ yếu là do các lập trình viên mới có nhiều kinh nghiệm về C # hơn SQL. SQL thường là một ngôn ngữ khai báo thẳng và điểm. Điều này có lợi ích rõ ràng cho việc viết và hiểu mã. Các nhà phát triển có thể tập trung vào vấn đề kinh doanh thay vì OOP kỹ thuật và các vấn đề về mẫu thiết kế. Đây là một trong những lý do chính mà chúng tôi thấy các tính năng như LINQ mang lại những lợi ích này cho các ngôn ngữ mệnh lệnh.
Jason Kresowaty

7

Việc sửa chữa / triển khai lại tầng giữa dễ dàng hơn so với DBMS.

Điều này có thể phụ thuộc vào kiến ​​trúc của bạn, nhưng đó là lý do của chúng tôi. Kết hợp điều đó với thực tế là chúng tôi có một DBA bận rộn hơn và (có thể) được trả nhiều hơn các nhà phát triển của chúng tôi. Tất cả các nhà phát triển đều biết SQL và một số trong số họ thành thạo ngôn ngữ thủ tục. Nếu một vấn đề sản xuất thực sự phức tạp xuất hiện, các nhà phát triển sẽ làm việc trên tầng giữa dễ dàng và nhanh hơn so với cơ sở dữ liệu, bất kể kiến ​​trúc sẽ tốt hơn theo cách này hay cách khác.


6

Tôi đã gặp khá nhiều người chỉ không biết rằng các tính năng như vậy tồn tại - họ đã chặt chẽ trong những ngày đầu của mySQL, và họ chưa bao giờ thực sự sử dụng bất kỳ thứ gì khác và họ không theo kịp sự tiến bộ của các bảng lưu trữ mới trong mySQL, thậm chí. Hoặc họ đã học cơ sở dữ liệu ở trường và họ đã không bao giờ quay lại để xem tất cả những thứ họ đã bỏ lỡ.

Họ học SQL tối thiểu để đạt được, và không nhận ra tất cả các phần mở rộng khác nhau mà các RDBMS khác nhau cung cấp.

Trong một dự án, tôi muốn có những cái nhìn cụ thể hóa ... nhưng tôi đang sử dụng Postgres. Tôi muốn sử dụng các kiểu dữ liệu không gian cho một dự án khác, nhưng tôi sẽ phải thực hiện hack hoặc thay đổi cơ sở dữ liệu để đối phó với sự khăng khăng của mySQL rằng chúng không được rỗng. Tôi thậm chí đã phải tìm cách vô hiệu hóa tính nhất quán giao dịch của Oracle để đối phó với các truy vấn chạy dài trên OLTP sẽ không có vấn đề gì trong mySQL.

Tôi thường có thể viết mã xung quanh những thiếu sót của cơ sở dữ liệu cho một vấn đề nhất định, nhưng một phần của vấn đề là chọn công cụ phù hợp cho công việc - trong một dự án hiện tại, chúng tôi đã lãng phí hàng tháng trời vào việc sao chép dữ liệu bởi vì chúng tôi bằng cách sử dụng Postgres, và họ quyết định chọn Slony-1 trước khi họ thực sự biết tất cả những gì chúng tôi sẽ tái tạo.

... Tôi xem câu hỏi này giống như 'tại sao nhiều người không sử dụng tính năng x trong ngôn ngữ y ' - nếu họ không phải là chuyên gia về ngôn ngữ y, họ có thể không biết tính năng x tồn tại.

(và đừng coi đây là sự hỗ trợ để đạt được chứng chỉ DBA ... Tôi đã biết một số DBA của Oracle không thể lập trình theo cách của họ khỏi một cái bao ẩm ướt; tôi đã tham gia tất cả các khóa học trong 8 ngày, nhưng từ chối làm các bài kiểm tra vì tôi không muốn bị gộp chung với nhóm đó)


2
PostgreSQL không hỗ trợ các kiểu dữ liệu không gian.
George Silva

PostGIS ( postgis.refractions.net ) là một lý do tiêu chuẩn để sử dụng PG nếu bạn chưa :)
Gregg Lind

5

Tôi nghĩ lý do lớn nhất làm lu mờ tất cả những thứ còn lại là hệ thống cơ sở dữ liệu quan hệ trở nên quan trọng hơn đáng kể khi nhiều ứng dụng đang chia sẻ cùng một dữ liệu. Bài báo nổi tiếng của Codd có tiêu đề "Mô hình dữ liệu quan hệ cho các ngân hàng dữ liệu được chia sẻ lớn " (tôi nhấn mạnh).

Mọi người có xu hướng nghĩ rằng ứng dụng họ đang viết bây giờ sẽ luôn được kiểm soát bởi nhóm của họ; và nó sẽ luôn đáp ứng mọi nhu cầu của những người quan tâm đến dữ liệu do ứng dụng tạo ra. Nếu nhu cầu mới phát sinh, điều đó sẽ được đáp ứng bằng cách thêm một tính năng mới vào ứng dụng hiện có, không phải tạo ứng dụng mới.

Nhưng trong nhiều trường hợp (tất nhiên không phải tất cả; mọi tình huống đều khác nhau), mô hình phát triển đó không hoạt động tốt về lâu dài. Khi dữ liệu do ứng dụng tạo ra tích lũy và trở nên quan trọng hơn đối với doanh nghiệp, những người khác nhau sẽ có những ý tưởng thú vị về cách sử dụng dữ liệu. Khi điều đó xảy ra, nếu bạn không có hệ thống quản lý cơ sở dữ liệu quan hệ, bạn đang gặp một thách thức lớn.


Có lẽ bạn sẽ không ngạc nhiên khi biết rằng các nhà phát triển DDD hiện coi "một cơ sở dữ liệu thực sự" là một mô hình chống lại. Xu hướng mới nhất là nhiều cơ sở dữ liệu được đồng bộ hóa thông qua các lớp chống tham nhũng.
Daniel Auger

5

Khả năng mở rộng. Bạn càng giao nhiều công việc cho máy chủ cơ sở dữ liệu, thì nó càng trở nên tắc nghẽn. Sẽ có nhiều khả năng mở rộng hơn khi có cả một hệ thống máy chủ ứng dụng cân bằng tải xử lý dữ liệu và chỉ sử dụng cơ sở dữ liệu như một kho lưu trữ liên tục.


4
Vì vậy, ... bạn có thể sử dụng "toàn bộ hệ thống máy chủ ứng dụng cân bằng tải", nhưng bạn không thể chỉ sử dụng toàn bộ hệ thống máy chủ cơ sở dữ liệu cân bằng tải vì ...? Bởi vì bạn không biết làm thế nào? Sau đó, bạn có thể cần tìm hiểu về phân cụm và sao chép cơ sở dữ liệu. Bởi vì nó chắc chắn là có thể.
Daniel Pryden 02/09/09

Xin lỗi, lẽ ra tôi phải có đủ điều kiện rằng tôi chỉ có kinh nghiệm về SQL Server, AFAIK không hỗ trợ cân bằng tải, chỉ vượt qua lỗi.
Christian Hayter 02/09/09

1
Vâng, sự hỗ trợ của SQL Server cho các cụm cân bằng tải là khá kém. Tuy nhiên, có nhiều cách bạn có thể thực hiện, sử dụng Chế độ xem được phân vùng phân tán và Định tuyến phụ thuộc vào dữ liệu. Oracle có RAC, một giải pháp tốt hơn nhiều cho các cơ sở dữ liệu lớn, có tính khả dụng cao, cân bằng tải. Chỉ cần chuẩn bị để trả tiền cho nó.
Daniel Pryden 02/09/09

2
@Daniel - máy chủ ứng dụng cân bằng tải dễ dàng hơn rất nhiều so với máy chủ cơ sở dữ liệu cân bằng tải. Thêm vào đó, việc mua thêm một máy chủ ứng dụng thường rẻ hơn nhiều (tức là chỉ cần mua một O / S và máy chủ đa CPU tiêu chuẩn) thay vì một máy chủ cơ sở dữ liệu bổ sung (O / S + Giấy phép DB đắt tiền + Máy chủ Beefy DB với ổ đĩa nhanh, tấn bộ nhớ, v.v.).
Bíp bíp

@Daniel Pryden: Bạn trả lời câu hỏi tu từ của riêng bạn. "bạn không thể chỉ sử dụng một loạt các máy chủ cơ sở dữ liệu cân bằng tải bởi vì ..." bạn phải chuẩn bị sẵn sàng chi trả cho nó.
Coxy

5

Tôi đã ở trong quá nhiều tình huống mà chính trị công ty ("chúng tôi không được phép truy cập vào SQL Server, vì vậy hãy cài đặt một DBMS kém mạnh hơn như Access để xử lý hàng triệu hàng và nối nó với hàng triệu hàng trong một bảng khác và cho phép tự động hóa quá trình nhập đó .. ") hoặc thậm chí là chính trị kỹ thuật có thể xảy ra (" Tôi biết Access có thể xử lý lượng dữ liệu đó và ngay cả khi không, chúng tôi có thể chia MDB thành nhiều MDB và tham chiếu chúng ..... ")

UGH. Chính trị công ty và chính trị kỹ thuật hoặc thậm chí sự thiếu hiểu biết đã ngăn cản tôi sử dụng nhiều tính năng.

Một ví dụ khác - Tôi thấy không có lý do gì để không sử dụng thủ tục lưu trữ trong một Microsoft cửa hàng 100% nơi SQL Server là các DBMS của sự lựa chọn. Nhưng, vì anh chàng IT cuối cùng sẽ sở hữu giải pháp “nhẹ tay” trên các SP nên tôi đành dùng đến các biện pháp khác. Ý tôi là, có một ví dụ hoàn hảo về lý do tại sao một số "tính năng" đó lại bị họ bỏ qua tại cửa hàng của họ.

Tôi biết một cửa hàng khác vẫn sử dụng DOS Foxpro 2 vì nhân viên IT duy nhất của họ đã viết hệ thống hiện có theo cách đó và đó là cách tất cả những thứ mới sẽ được phát triển. Tại sao? Chúng ta không thể di chuyển cùng với thời gian? Nhiều nhân viên tiếp thị ở đó có một số lời nhắc DOS mở cùng một lúc, với các "công việc" của Foxpro đang chạy trong đó để tạo ra những báo cáo xấu xí nhất mà tôi từng thấy. Nhưng nó hoạt động - tôi sẽ cung cấp cho họ điều đó. Nó hoạt động - họ có 12 triệu hàng trong bảng chính của họ và hơn 50 bảng khác mà họ 'tham gia' với bảng chính đó (rõ ràng không phải tất cả 50 hàng cùng một lúc) nhưng người đàn ông ... đã qua năm 1991! Họ thậm chí không muốn thảo luận về một mục từ danh sách gạch đầu dòng mà bạn đã cung cấp trong câu hỏi của mình.

Những thứ như thế này là lý do tại sao tôi đoán.


4

Tôi sẽ nói lý do lớn nhất là hầu hết mọi người không biết về chúng. Khi ai đó đã tìm ra giải pháp cho một vấn đề, đó sẽ trở thành giải pháp mặc định cho những vấn đề tương tự. Bảng SELECT * FROM đã hoạt động với rất nhiều người trong một thời gian dài, vì vậy họ không bận tâm đến các cách tiếp cận mới cho các vấn đề cũ.

Lý do khác là đôi khi viết nó bằng mã dễ hơn nhiều so với sử dụng cơ sở dữ liệu. Ý tưởng giống như việc tự giới thiệu sản phẩm của riêng bạn so với mua một bộ phận trên kệ. Sử dụng tính năng được viết sẵn có thể giải quyết vấn đề của bạn nhiều lần, nhưng thỉnh thoảng, bạn cần phải làm điều gì đó nằm ngoài khả năng của những gì các thành phần viết sẵn có thể thực hiện.


4

Câu hỏi hay và thảo luận tốt.

Một cách khác để đặt nó là "tại sao các DB đối tượng không được bắt kịp?" là mặt còn lại của đồng xu. DB tiếp tục là một thứ trừu tượng khó chịu vẫn có thể xâm nhập vào mọi ứng dụng hiện có, nhưng chúng không tương thích với logic OO của các ứng dụng hiện đại.

Thực sự là một trạng thái kỳ lạ khi chúng tôi ẩn và sao chép chức năng của DB trong ActiveRecord, Hibernate và các phần mềm trung gian khác. Nhưng đây là những gì sẽ xảy ra với các mô hình tại điểm bị đứt ("Sự không phù hợp trở kháng quan hệ đối tượng"). Liệu chúng ta có bao giờ chuyển đổi sang các công nghệ cơ sở dữ liệu tương tự như các ứng dụng OO của chúng ta (ví dụ: DB đối tượng) không?

Câu trả lời là "không lâu nữa" và trong thời gian chờ đợi, DB sẽ bị bỏ qua và thu gọn lại và chỉ được sử dụng để lưu trữ hàng trong nhiều trường hợp, khi tầng giữa phát triển về chức năng để thu hẹp khoảng cách.

Một câu hỏi khác là "tại sao tôi lại làm điều đó trong DB nếu tầng giữa có thể làm được?" Tầng trung lưu đã quen thuộc và luôn đạt được điểm mạnh về tốc độ và chức năng. Một lần nữa, chúng tôi sử dụng tầng giữa để tránh sự không khớp OO-RDMS.


4

Để nâng cao những gì Christian đã nói, về khả năng mở rộng.

Đơn giản, các RDBM đang được sử dụng nhiều hơn như một kho lưu trữ dữ liệu thuần túy, trong khi logic đã được chuyển sang Máy chủ Ứng dụng. Cấp bổ sung của AS cung cấp cho các nhà phát triển sự linh hoạt hơn so với việc sử dụng RDBMS làm Máy chủ ứng dụng.

Trước đây, trong những ngày cổ điển của Fat Apps và Client Server, DB và Application Server về cơ bản giống nhau. Bạn có logic ứng dụng được nhúng trong mã ứng dụng béo của mình hoặc bạn đã đẩy nó trở lại RDBMS. Nhưng hồi đó, hình thức giao tiếp chính là SQL trực tiếp đến cơ sở dữ liệu.

Ngày nay, các giao thức ứng dụng khác phổ biến hơn (CORBA, DCOM, Remote EJB và ngày càng phổ biến hơn ngày nay là các giao thức kiểu XML / JSON / HTTP-RPC qua HTTP). Hầu hết các cơ sở dữ liệu không phản hồi trực tiếp với các giao thức đó, vì vậy một lớp Ứng dụng được xen vào để chặn các cuộc gọi đó và lớp đó gọi cơ sở dữ liệu.

Nhưng như chúng ta đã học, bây giờ chúng ta sẽ linh hoạt hơn rất nhiều khi đưa logic vào lớp này. Nhiều lựa chọn công cụ hơn, linh hoạt hơn trong bộ nhớ đệm, hoặc chuyển đổi dự phòng, hoặc thậm chí là công nghệ cơ sở dữ liệu (RDMBS, OODBMS, Kho lưu trữ tài liệu như CouchDB). "Mới" đó, tầng thứ 3, mặc dù có thêm sự phức tạp, nhưng lại thêm tính linh hoạt và sức mạnh hơn so với mức độ phức tạp mà nó giới thiệu.

Khi tầng ứng dụng của bạn là một lớp rất mỏng ở phía trên Quy trình được lưu trữ, bạn nên đặt câu hỏi tại sao nó lại ở đó.

Tận dụng cơ sở dữ liệu và tất cả các tính năng của nó là một chiến lược ứng dụng hợp lệ, ngay cả ngày nay. SQL Server, Oracle, v.v., là những phần mềm cực kỳ mạnh mẽ.

Mặc dù vậy, ngay cả khi đó, tầng thứ ba rất hữu ích trong việc bổ sung tính linh hoạt cho một hệ thống hiện đại.


3

Đối với tôi, lý do không chỉ là các ứng dụng của tôi không có cơ sở dữ liệu, mà là cơ sở dữ liệu định dạng tốt nhất các chức năng CRUD cơ bản. Vâng, cơ sở dữ liệu được tối ưu hóa cao và có thể tạo chú thích HTTP, nhưng tại sao bạn lại làm điều đó? Dịch vụ web / ứng dụng web được tối ưu hóa cho các cuộc gọi HTTP, không phải cơ sở dữ liệu. Cũng giống như một ứng dụng không được thiết kế để kết nối trực tiếp với một tệp dữ liệu và truy xuất dữ liệu. Nó có thể được thực hiện? Có, nhưng tại sao? Đó không phải là điều mà ứng dụng của bạn TUYỆT VỜI.

Cá nhân tôi cảm thấy rằng mọi thứ bạn đã đề cập, bên ngoài các thủ tục được lưu trữ đều thuộc về ứng dụng. Nếu bạn biết kiến ​​trúc của mình là X thì hãy tận dụng các tính năng của X, tải xuống máy chủ DB khi thích hợp, v.v. Nếu nó có thể là X hoặc Y (hoặc Z), thì ứng dụng của bạn phải là bất khả tri, trừ khi bạn cố gắng tạo ra sự an toàn cho công việc bằng cách đảm bảo rằng bạn có thể phải cấu trúc lại ứng dụng :). Tôi nghĩ rằng một chút lười biếng, kết hợp với sự thoải mái có thể liên quan đến nó. Tôi biết tôi muốn làm điều đó trong C # hơn là SQL nếu tôi có thể. . . kỹ năng C # của tôi tốt hơn.


1
Vấn đề là bạn có thể sử dụng cơ sở dữ liệu cho nhiều hơn các hàm CRUD. Nếu tất cả những gì bạn cần là CRUD, thì hãy sử dụng sqlite. Vấn đề là nếu bạn đang thực hiện xử lý dữ liệu, đặc biệt là thống kê, số trung bình hoặc nội suy, trên các tập dữ liệu lớn (ít nhất hơn một triệu hàng), thì cơ sở dữ liệu có rất nhiều tính năng khác dễ thực hiện trong SQL hơn C #. Điều thú vị là LINQ đang thêm rất nhiều chức năng tương tự, về cơ bản là xây dựng chức năng cơ sở dữ liệu và cú pháp khai báo giống SQL vào C #. Toàn bộ vấn đề là xử lý dữ liệu thứ mà cơ sở dữ liệu vượt trội !
Daniel Pryden 02/09/09

Tôi thấy quan điểm của bạn, và đối với tôi, số liệu thống kê và những gì không phải là một phần của chức năng đọc. Tôi không thấy lợi ích của việc DB thực hiện lệnh gọi http hoặc tạo tài liệu XML. Điều này liên kết rõ ràng ứng dụng của bạn với các tính năng cụ thể của cơ sở dữ liệu và giảm thiểu bất kỳ khả năng chuyển ứng dụng nào sang nhà cung cấp DB khác mà không gây ra việc viết lại lớn. . . bạn đã bao giờ chuyển từ MySQL sang SQL server chưa? có đủ khác biệt về cú pháp và những gì không giống với một truy vấn phức tạp sẽ thường xuyên hơn sau đó không cần phải viết lại. Do đó làm tăng khả năng đưa ra các lỗi mới.
andrewWinn

3

Trước hết: bất kỳ nhà phát triển nào sử dụng ORM đều ngây thơ nếu S / anh ta nghĩ rằng việc sử dụng ORM phủ nhận việc phải có kỹ năng SQL. Hầu hết các ORM tạo SQL thay đổi SQL được tạo ra tùy thuộc vào cách các truy vấn đối tượng được xây dựng. Nhà phát triển sẽ cần phân tích SQL để xem họ có nên thay đổi bất kỳ truy vấn đối tượng nào hay không.

Câu trả lời ngắn gọn: Rất nhiều tính năng đó không thực tế cho việc phát triển OO. Tôi biết rằng các DBA không thích nghe điều đó nhưng, đó là sự thật. Những tính năng đó tốt cho các trường hợp cạnh và hầu hết các ORM tốt như N / Hibernate cho phép bạn cung cấp SQL cho các trường hợp cạnh đó.

Khi nói đến phần lớn được ủy quyền cho CRUD:

Câu trả lời dài: Tôi nghĩ thế giới RDBMS đang trải qua giai đoạn trưởng thành đau đớn và đang tìm thấy vị trí của nó trên thế giới. Sự thật: OOP cũ hơn RDBMS. OOP chỉ là thoát khỏi những nỗi đau ngày càng tăng và trưởng thành. Tôi nghĩ rằng SQL là một ngôn ngữ đã rất trưởng thành, nhưng ý tưởng về những gì một RDBMS nên xử lý chỉ đang được giải quyết. RDBMS là công cụ nắm giữ logic nghiệp vụ cho hầu hết các ứng dụng web cho đến khi Java và C # xuất hiện. Tôi nghĩ bây giờ chúng ta mới bắt đầu cảm nhận được sự điều chỉnh này.

Điều đó đang được nói, tôi không nghĩ rằng bất kỳ nhà thiết kế ORM nào sẽ nói với bạn rằng chất lượng của các câu lệnh sql được cung cấp cho RDBMS không quan trọng.

Khi nói đến KHÔNG PHỤ THUỘC, tôi không có câu trả lời ở đây. Hầu hết các cửa hàng tôi biết vẫn sử dụng DB cho ETL / v.v.


"Idiot" là một từ mạnh mẽ như vậy. Có thể "ngây thơ" , "lười biếng" , hoặc "thiếu kinh nghiệm" cũng sẽ chính xác như nhau nếu không có sự non nớt . Chỉ vừa đủ.
Stu Thompson

Điểm tốt. Tôi đã loại bỏ câu trả lời ở một mức độ nào đó. Tôi đã đi với ngây thơ.
Daniel Auger

2

Không có đủ nhà phát triển biết tất cả các tính năng đó ở cấp độ thực sự sẽ tạo ra sự khác biệt đối với một lập trình viên 'trung cấp' bình thường, khi nói đến việc triển khai cùng một logic vào DB hoặc cấp trung bình. Có thể những người thực sự có kiến ​​thức chuyên sâu về các tính năng đó là DBA. Và những vấn đề đó tập trung vào các vấn đề khác hơn là phát triển. Có nhiều nhà phát triển 'bình thường' hơn là DBA. Vì vậy, sẽ rất khó khăn và tốn kém để tìm đúng người cho nhóm của bạn.

Một điểm khác là bạn thường chỉ thu thập kiến ​​thức chuyên sâu về một hệ thống cơ sở dữ liệu chứ không phải tất cả chúng. Vì vậy, bạn có thể có chuyên gia SQL Server hoặc chuyên gia Oracle, nhưng không phải cả hai. Điều này dẫn đến (ở một mức độ nào đó) các lĩnh vực ứng dụng thu hẹp nơi tính chuyên môn hóa cao. Sau đó, thị trường cho các ứng dụng như vậy không phải là lớn, ngay cả khi nó ở đó.


1

Tôi nghĩ rằng lý do là sự kết hợp của việc nhà cung cấp khóa và thiếu kiến ​​thức của hầu hết người dùng RDBM. SQL là một ngôn ngữ lập trình và việc thành thạo cả ngôn ngữ bạn đang gọi là SQL và SQL sẽ khó hơn nhiều so với việc thông thạo ngôn ngữ này hay ngôn ngữ khác, đặc biệt là vì SQL là một ngôn ngữ đặc biệt độc đáo.

Theo tôi, giải pháp là trừu tượng hóa chức năng cơ sở dữ liệu của bạn thành một lớp tiện ích và trao quyền sở hữu lớp đó cho một vài người dùng biết họ đang làm gì với SQL. Điều này giảm thiểu rủi ro bị khóa nhà cung cấp (nếu bạn chuyển đổi nhà cung cấp, thứ duy nhất được viết lại là lớp). Điều này cũng cung cấp cho các nhà phát triển không phải chuyên gia về SQL một giao diện trừu tượng hóa để họ không phải xử lý cơ sở dữ liệu trực tiếp.


0

Một mối quan tâm mà tôi đã thấy với việc tận dụng chức năng cơ sở dữ liệu tăng lên là mở rộng quy mô. Nó có vẻ là một đề xuất khó hơn nhiều để chia tỷ lệ tải cơ sở dữ liệu của bạn so với tải máy chủ web / ứng dụng.

Các tùy chọn của bạn bị hạn chế, mở rộng quy mô với phần cứng lớn hơn nhanh hơn (đôi khi chi phí cấp phép cao hơn nhiều) hoặc phức tạp, mở rộng quy mô với các bản sao chỉ đọc, v.v.

Nếu có vấn đề về hiệu suất, tôi muốn chúng ở cấp ứng dụng máy chủ web. Ít nhất thì một trong những tùy chọn của tôi là thêm một máy chủ web khác và phân phối tải.

Tôi không phản đối mã mức cơ sở dữ liệu để giảm thiểu lượng lưu lượng mạng (bản ghi) được gửi giữa máy chủ web và máy chủ cơ sở dữ liệu. Tôi đang tranh luận chống lại các tính năng khác, ví dụ. xử lý logic nghiệp vụ mở rộng ở cấp độ cơ sở dữ liệu.


0

Một số bài viết lưu ý rằng việc mở rộng quy mô ở lớp ứng dụng sẽ rẻ hơn ở lớp db.

Một cân nhắc khác là các ứng dụng tổng hợp truy cập nhiều kho dữ liệu. Dễ dàng hơn nhiều để viết và duy trì ngôn ngữ truy vấn bất khả tri nền tảng trong cấp ứng dụng so với các truy vấn nền tảng cụ thể riêng biệt trong lớp db.


0

Bởi vì viết phần mềm hướng đối tượng, bằng ngôn ngữ máy chủ, với các đối tượng ngôn ngữ máy chủ bản địa, sẽ đánh bại việc viết phần mềm thủ tục.


0

Tôi đã luôn làm việc trên các hệ thống được bán cho nhiều khách hàng và chạy trên phần cứng của khách hàng. Điều này dẫn đến:

  • Bạn không biết máy khách sẽ chạy phiên bản phần mềm cơ sở dữ liệu nào.
  • Khách hàng có thể không sẵn sàng cập nhật phần mềm cơ sở dữ liệu khi bạn muốn do chi phí giấy phép hoặc do chính sách CNTT.
  • Ngay cả những tính năng cơ bản như khung nhìn cụ thể hóa cũng chỉ có trong một số “phiên bản” của phần mềm cơ sở dữ liệu, những khách hàng nhỏ hơn thường không sẵn sàng trả tiền cho phiên bản cao cấp của cơ sở dữ liệu.
  • Không sớm thì muộn, một trong những người bán hàng của bạn sẽ đồng ý cho phần mềm của bạn được sử dụng với RDBMS của một nhà cung cấp khác.
  • Lựa chọn giữa việc viết logic một lần ở tầng giữa, hoặc ít nhất là PL-SQL và TSQL trong cơ sở dữ liệu là một lựa chọn dễ dàng!
  • Bất kỳ thay đổi nào đối với cơ sở dữ liệu (Thủ tục được lưu trữ mới, dạng xem cập nhật, v.v.) sẽ yêu cầu quyền quản trị viên DB; điều này có thể khó hơn rất nhiều trên một số trang web của khách hàng sau đó chỉ cần cập nhật phần mềm của bạn.
  • Viết một script để cập nhật cơ sở dữ liệu luôn khó hơn cài đặt một phiên bản mới của ứng dụng. (Hầu hết các hệ thống xây dựng ngày nay đều xuất ra các tệp MSI như một phần của mọi bản dựng)
  • Khó hơn để đơn vị mã kiểm tra trong cơ sở dữ liệu sau đó là tầng giữa.
  • Khó gỡ lỗi các procs được lưu trữ hơn C #.
  • Chỉ vì nó hoạt động trên cơ sở dữ liệu của bạn không có nghĩa là nó sẽ hoạt động trên cơ sở dữ liệu của khách hàng, RDBMS có quá nhiều công tắc thay đổi cách chúng hoạt động - khách hàng luôn có xu hướng đặt chúng theo những cách khác nhau.

Vì vậy, với tất cả những điều trên, lợi ích từ việc sử dụng một tính năng cơ sở dữ liệu phải là rất lớn trước khi nó đáng phải chịu đựng lâu dài.

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.