Tại sao cơ sở dữ liệu không được tích hợp như một tính năng ngôn ngữ?


25

Có ngôn ngữ lập trình nào có cơ sở dữ liệu tích hợp làm tính năng ngôn ngữ hạng nhất thay vì kết nối với cơ sở dữ liệu SQL bên ngoài (hoặc khác) không? Điều gì sẽ là nhược điểm và lợi ích cho một tính năng như vậy? Một tính năng như vậy sẽ trông như thế nào và nó sẽ thay đổi cách chúng ta lập trình như thế nào?


17
Tôi nghĩ rằng SQL là một ngôn ngữ. : D
Kevin Cantu

8
.NET có LINQ cho SQL, mà tôi nghĩ là cách tiếp cận đúng cho một vấn đề chung. Bạn không nên khóa vào một cơ sở dữ liệu cụ thể và bạn không thể tạo ra một cái gì đó đủ chung chung và thực hiện mọi tính năng của mọi thứ ngoài kia. LINQ vẫn tuyệt vời, giống như tôi.
Công việc

linq2Query đã chết, được thay thế bằng linq2EF, nhưng cùng một nguyên tắc
BlackICE

3
và thật không may, Linq2EF có một số tiện ích mở rộng chỉ dành cho microsoft khó chịu, có nghĩa là bạn bị khóa vào SQLServer nếu bạn làm bất cứ điều gì phức tạp.
gbjbaanb

1
@Job "Bạn không nên khóa vào một cơ sở dữ liệu cụ thể" Nói chung như đã nêu, tôi không thể không đồng ý nhiều hơn với ý tưởng đó nói chung. Thay vào đó, tôi sẽ tinh chỉnh triết lý đó hoặc ngừng truyền bá nó. Chẳng hạn, tôi sẽ không khóa mã lớp UI của mình vào một cơ sở dữ liệu cụ thể. Tuy nhiên, tôi chắc chắn sẽ khóa mã lớp dịch vụ của mình vào một cơ sở dữ liệu cụ thể.
Michael O'Nillill

Câu trả lời:


15

Ngôn ngữ duy nhất mà tôi có thể nghĩ đến là các ngôn ngữ xBase cũ như DBase, Clipper và FoxPro. Có một dự án GNU cung cấp một phiên bản miễn phí và hầu hết tương thích được gọi là Clip

Cũng được Pick cơ bản mà gắn liền với một ngôn ngữ lập trình trực tiếp đến một nền tảng cơ sở dữ liệu.

Điều này đã được thực hiện. Đó là một ngõ cụt tiến hóa giới hạn làm thế nào một ngôn ngữ có thể truy cập dữ liệu.


2
Bạn có thể mở rộng lý do tại sao nó là một ngõ cụt tiến hóa? Tôi không nghĩ đến việc thực hiện nó, tôi chỉ tò mò.
VirtuosiMedia

1
@VM Đã có một xu hướng rõ ràng là sử dụng API và giữ cho ngôn ngữ, thư viện và thời gian chạy khác biệt. Hiện tại, các API được xác định rõ cho phép truy cập dữ liệu theo cách phổ biến; bất kể ngôn ngữ hoặc cơ sở dữ liệu hoặc thậm chí lược đồ cơ sở dữ liệu là phổ biến. Hầu hết các ngôn ngữ phổ biến đều gửi API cơ sở dữ liệu chung như một phần của thư viện chuẩn. Ditto cho tập tin và truy cập http. Không còn cần phải bắt nó vào ngôn ngữ.
sal

1
có các lệnh chênh lệch cường độ trong thời gian cuộc gọi cục bộ so với API từ xa, thêm nhiều hơn nếu giao diện mạng tồn tại. Vẫn có những lợi thế khác biệt và thực sự khi sử dụng các ngôn ngữ trong ngăn xếp DB.
Jé Queue

@Xepoch chắc chắn nếu bạn muốn tự khóa cơ sở dữ liệu triển khai ngôn ngữ của nhà cung cấp đó .
BlackICE

1
@David, đọc lại câu hỏi, cầu nguyện cho biết ngôn ngữ này sẽ không bao giờ được sử dụng cho khóa nhà cung cấp?
Jé Queue

29

Ngôn ngữ là "nhỏ" và cơ sở dữ liệu là "lớn"; vì vậy, bất cứ khi nào cả hai được kết hợp, đó không phải là một ngôn ngữ với cơ sở dữ liệu như một tính năng, mà là một cơ sở dữ liệu với ngôn ngữ là một tính năng. Nhiều cơ sở dữ liệu có một số ngôn ngữ độc quyền được xử lý theo chúng, ví dụ PL / SQL, T-SQL.


Ngôn ngữ "nhỏ" như thế nào?
Rei Miyasaka

Đó là vấn đề về nhận thức. Tất nhiên, cơ sở dữ liệu dường như có một cơ sở mã lớn hơn, tài liệu lớn hơn, yêu cầu đĩa lớn hơn (ngay cả khi chúng tôi không xem xét dữ liệu truyền động); nhưng những so sánh đó hầu như không công bằng vì hầu hết các cơ sở dữ liệu đều đi kèm với một hoặc thậm chí một số ngôn ngữ lập trình.
user281377

3
Rei: Bạn chưa xem xét kỹ hơn về PL / SQL, phải không? BTW, Oracle cũng bao gồm một JVM trong RDBMS.
user281377

3
Rei: Trên thực tế, nhiều người sử dụng PL / SQL để viết các ứng dụng, ít nhất là phần logic nghiệp vụ. Như bạn có thể biết, PL / SQL cũng là ngôn ngữ được sử dụng trong Oracle Forms, vì vậy về cơ bản bạn có thể viết và chạy chương trình PL / SQL không bao giờ chạm vào cơ sở dữ liệu. Trong thực tế, PL / SQL được sử dụng cùng với một RDBMS của Oracle.
user281377

2
Vâng, không bao giờ có thể nghĩ.
Rei Miyasaka

16

Tôi không nhất thiết nghĩ câu hỏi đúng là "tại sao không có?" nhưng "tại sao nên có?". Điều gì sẽ thu được từ việc có cơ sở dữ liệu là một tính năng của ngôn ngữ? Hãy nhớ rằng, ngôn ngữ nằm ở dưới cùng của ngăn xếp lập trình. Làm cho một ngôn ngữ cồng kềnh ảnh hưởng đến tất cả mọi thứ . Do đó, các nhà thiết kế ngôn ngữ cần phải chậm để thêm các tính năng mới, đặc biệt là các tính năng có liên quan đến khoản đầu tư như vậy.


6
Bởi vì bạn muốn có lợi ích của việc kiểm tra kiểu và thậm chí kiểm tra tên đơn giản, khi bạn đang làm việc trên ranh giới của ngôn ngữ truy vấn và ngôn ngữ lập trình.
Macneil

4
@Macneil, công cụ ORM làm điều đó ngay bây giờ. Điều gì cần được chốt vào ngôn ngữ khi API có thể làm điều đó?
sal

1
@sal Vì vậy, các nhà phân phối ứng dụng không phải bó một DBMS lớn chỉ để có được ghi nguyên tử và kiểm tra tính nhất quán cho bộ nhớ cache, chỉ mục tìm kiếm, v.v ... Đây là lý do tại sao SQLite tồn tại: " để cạnh tranhfopen() ".
Damian Yerrick

@sal: có lẽ là vì một lý do tương tự tại sao các biểu thức chính quy hoặc dấu phẩy động được gói vào một số ngôn ngữ khi API có thể làm điều đó. Bởi vì ai đó đã viết một ngôn ngữ và quyết định chúng đủ cơ bản để đảm bảo cú pháp đặc biệt. Tất nhiên, đó là một lý do chung chung để không phải là một câu trả lời hữu ích ;-)
Steve Jessop

14

Có 3 hệ thống kế thừa gần với yêu cầu của bạn:

  1. Chọn ,
  2. quai bị ,
  3. Truy cập Microsoft

Pick và MUMPS đã được phát triển nhiều năm trước khi bài báo học thuật đầu tiên về cơ sở dữ liệu quan hệ (khoảng một thập kỷ trước khi hệ thống cơ sở dữ liệu dựa trên SQL thương mại đầu tiên xuất hiện trên thị trường - từ một công ty mà bây giờ chúng tôi gọi là Oracle; một hệ thống dựa trên SQL thành công là sau này). Bạn có thể thấy chúng vẫn còn được sử dụng (hệ thống giao thông công cộng địa phương của chúng tôi đã sử dụng Pick cho đến gần đây cho hệ thống lập kế hoạch chuyến đi). Bạn không muốn làm gì với Pick hoặc MUMPS, và lời khuyên tốt nhất tôi có thể đưa ra là "bước ra khỏi bàn phím với bàn tay của bạn trong không khí!" Nếu bạn làm có bất cứ điều gì để làm với họ, cụm từ "bạn sẽ được xin lỗi" nên ù tai.

Microsoft Access bị chế giễu và chỉ trích nặng nề trong giới CNTT vì khá dễ dàng cho một người không phải là nhà phát triển để tạo một ứng dụng kinh doanh quan trọng ra khỏi Access và biến nó thành thứ gì đó mà công ty hoàn toàn không thể sống. Cũng có khả năng khá nhiều nhà phát triển đã bắt đầu phát triển thông qua MS Access và khi mọi thứ bị sa lầy, họ đã học cách sửa chúng (bước đầu tiên là học cơ bản trực quan và viết lại ứng dụng Access trước tiên trong VB, sau đó trong một cái gì đó "tốt hơn"). Có thể tạo một ứng dụng Access hoạt động tốt, được phân phối với một lượng dữ liệu khổng lồ - tôi đã thấy nó được thực hiện - nhưng có nhiều cách dễ dàng hơn để thực hiện và cần ít kỹ năng hơn để tạo (và duy trì) tốt ứng dụng ra khỏi VB và SQL Server.

Kể từ SQL Server 2005, Microsoft đã giới thiệu khả năng đưa CLR vào các quy trình và chức năng được lưu trữ. Và nếu bạn muốn khéo léo về nó, bạn có thể tạo các kiểu dữ liệu mà sau đó bạn có thể sử dụng làm cột trong cơ sở dữ liệu. Tôi nghĩ rằng Oracle đã có một cái gì đó tương tự với Java.

Điều đó đang được nói, tôi không nghĩ có bất cứ điều gì ngăn cản bạn tạo ra một hoặc giả thuyết về chúng. Pick và MUMPS cũ hơn hầu hết các lập trình viên ở đây và phản ánh một cách nhìn rất LỚN về thế giới.

Lời khuyên cá nhân của tôi là giữ mọi thứ riêng biệt. Sử dụng ngôn ngữ có khả năng thao túng dữ liệu mà dự án của bạn cần (với lời cảnh báo đôi khi ngôn ngữ "tốt nhất" là ngôn ngữ mà bạn có thể dễ dàng tìm thấy các lập trình viên có thể đọc / viết mã). Sử dụng một hệ thống cơ sở dữ liệu tốt để giữ dữ liệu mà dự án của bạn cần.


+1 mặc dù tôi nghĩ rằng một lập trình viên đủ kỹ năng để tạo ra một ứng dụng Access có thể mở rộng xứng đáng có một môi trường làm việc tốt hơn.
Larry Coleman

3
Access không phải là ngôn ngữ lập trình, nó là môi trường thời gian chạy và phát triển tích hợp. Ngôn ngữ mà nó sử dụng, VBA là ngôn ngữ được sử dụng để lập trình macro trong các sản phẩm văn phòng khác và không phải là Access cụ thể. Truy cập DB vẫn được thực hiện thông qua các nhà cung cấp khác nhau cho trình điều khiển JET.
Jeremy

1
Ngoài ba môi trường bạn đã đề cập, còn có một số môi trường 4GL: Oracle Forms, CA OpenROAD (nee Ingres Windows4GL) và Unify's Accell (chỉ để đặt tên cho những môi trường tôi đã làm việc cùng).
TMN

Ngoài ra, tôi không chắc Access thực sự là "di sản", bất kể bạn muốn nó thân thương đến mức nào :)
haylem

+1 cho quai bị cơ sở dữ liệu tuyệt vời gắn liền với một ngôn ngữ hợp pháp.
James Anderson

4

Thêm cơ sở dữ liệu vào ngôn ngữ lập trình có thể chỉ phục vụ cho một nhóm người dùng rất hẹp. Điều gì xảy ra nếu họ muốn sử dụng một số tính năng không phải RDBMS? Hoặc không muốn sử dụng một cơ sở dữ liệu nào cả? Trình biên dịch sẽ không cần thiết bị cồng kềnh cho các trường hợp sử dụng như vậy.


4

Ơ.

Chà, trước tiên, bạn đang hỏi tại sao khuôn khổ mà ngôn ngữ vận hành không cung cấp cơ sở dữ liệu. Một ngôn ngữ chỉ đơn giản là một phương tiện để diễn đạt một cái gì đó mà bạn muốn thực hiện trong bộ ngữ pháp; nó không thực sự cung cấp dịch vụ như thế. :)

Điều đó nói rằng, có một số lý do.

  • Xây dựng một hệ thống lưu trữ cơ sở dữ liệu hiệu quả là một vấn đề khó khăn, có thể theo thứ tự hoặc lớn hơn so với việc xây dựng .NET Framework (ví dụ). Nếu một nhóm cố gắng đưa cơ sở dữ liệu vào khung của họ, đó sẽ là tất cả những gì họ kết thúc.

  • Một cơ sở dữ liệu được tải phải nằm trên máy riêng của nó chứ không phải trong quá trình mã truy cập vào nó.

  • Các ORM cung cấp rất nhiều loại kiểm tra thời gian an toàn và biên dịch sẽ là lợi ích của một hành động như vậy, mà không thực sự có khung cố gắng trở thành một cơ sở dữ liệu.

Điều đó nói rằng, tôi đoán sẽ rất gọn gàng khi bao gồm một số loại triển khai SQLite trong khuôn khổ mà các ứng dụng có nhu cầu truy cập dữ liệu nhỏ hơn có thể hoạt động. Tuy nhiên, tôi không chắc nó sẽ hữu ích trong các ứng dụng không tầm thường.


sqlite nhúng thực sự tuyệt vời, nếu bạn không có nó, các nhà thiết kế ngôn ngữ cuối cùng chỉ sử dụng XML làm cơ chế lưu trữ :(
gbjbaanb

2

họ đang; những ngôn ngữ như vậy được gọi là 4GL . DataFlex là sở thích của tôi, mặc dù tôi không sử dụng nó nữa.

Hãy cẩn thận: Tôi đã giúp phát triển phiên bản hướng đối tượng của DataFlex, v3.0


2

Tôi nghĩ rằng câu hỏi thực tế của bạn là "tại sao không có ngôn ngữ lập trình đi kèm với thư viện cơ sở dữ liệu ".

Các ngôn ngữ có mục đích chung coi tất cả IO là một và giống nhau, có thể là viết hoặc đọc đến / từ đĩa, webcam, mạng, màn hình, vị trí trong bộ nhớ - tất cả đều là IO và đó là tất cả những ngôn ngữ lập trình liên quan đến chính chúng với.

Trong thực tế, ngoài việc đọc / viết cho đến đống và chồng, hầu hết các ngôn ngữ lập trình thậm chí không thực hiện bất kỳ IO thực tế nào. Một số ngôn ngữ cung cấp các tính năng gốc để thể hiện các hoạt động IO (ví dụ: print lệnh trong BASIC), nhưng hầu hết các ngôn ngữ chỉ coi chúng là các cuộc gọi chức năng thông thường (ví dụ như printftrong C) và để các thư viện xử lý việc viết thực tế.

Một số ngôn ngữ như C # cung cấp các tính năng ngôn ngữ để thể hiện các truy vấn, nhưng ngay cả khi đó, đó chỉ là các biểu thức trên cấu trúc dữ liệu cơ bản nhất của danh sách ( IEnumerablenhư chúng được gọi trong .NET) được dịch sang các hoạt động SQL của các thư viện - bản thân ngôn ngữ vẫn chỉ hoạt động với các khái niệm rất trừu tượng về IO.

Đối với lý do tại sao xây dựng gói cơ sở dữ liệu vào thư viện chuẩn của ngôn ngữ lập trình không phải là một ý tưởng hay, rất có thể vì không có gì khác trong thư viện chuẩn thường phụ thuộc vào chức năng cơ sở dữ liệu.


Rất nhiều ngôn ngữ lập trình đi kèm với các thư viện DB. Cả Python và PHP đều có sqlite. Visual Studio xuất xưởng với SQL Server Express.
tử

Đó là các giao diện DB, không phải DB. Thời gian chạy .NET không giao hàng với Visual Studio hay SQL Server Express.
Rei Miyasaka

@ReiMiyasaka Thư viện chuẩn Python bao gồm toàn bộ công cụ SQLite, vì SQLite chỉ là một thư viện C mà chương trình liên kết, không phải là một quá trình riêng biệt hay bất cứ điều gì.
Damian Yerrick

2

Vâng. Các ngôn ngữ trên nền tảng AS / 400 có hỗ trợ cơ sở dữ liệu bản địa, hạng nhất.

Điều này là do nền tảng AS / 400 có cơ sở dữ liệu được tích hợp đầy đủ ở mọi nơi và cho phép rất nhiều tính năng rất hay, như dễ điều hướng thông qua một kết quả cập nhật các giá trị trên đường đi.


0

Phụ thuộc vào ngôn ngữ và nền tảng. Ví dụ, việc sử dụng nhiều loại cơ sở dữ liệu trong khi làm việc với C là khá đơn giản, tôi chỉ sử dụng thư viện thích hợp.

Một ngôn ngữ phải duy trì việc thực hiện tiêu chuẩn của nó và điều đó thường có nghĩa là cung cấp số lượng tối thiểu cần thiết để ai đó có thể xây dựng bất cứ thứ gì họ muốn xây dựng. Mọi thứ khác trở thành một thư viện, hoặc có lẽ là một phần mở rộng cho ngôn ngữ được duy trì bởi những người khác.

Ít nhất, đây là trường hợp đối với các ngôn ngữ tuân theo các tiêu chuẩn được thiết lập bởi các tổ chức như ISO.


0

Như đã viết, câu hỏi là một phần sai, như một số phản ứng ở trên đã chỉ ra.

Vì vậy, trước tiên tôi sẽ tinh chỉnh câu hỏi để đọc, "Tại sao DBMS thường không được tích hợp như một tính năng của ngôn ngữ lập trình cấp cao, mục đích chung?"

Điều này là vì lý do tương tự mà các sản phẩm phần mềm khác như hệ điều hành, hệ thống tệp, máy chủ web, các lớp bộ đệm, v.v. thường không được tích hợp sẵn. Các ngôn ngữ có mục đích chung thường hoạt động ở mức độ trừu tượng cao hơn các sản phẩm đó. Vì vậy, thật hợp lý khi lập trình viên thực hiện DBMS trongmột ngôn ngữ có mục đích chung và DBMS thậm chí có thể phơi bày các khía cạnh của ngôn ngữ mẹ hoặc ngôn ngữ khai báo dành riêng cho DB để các lập trình viên DB sử dụng. Nhưng có quá nhiều tùy chọn thiết kế trong việc viết DBMS để nó trở nên khôn ngoan để sửa chúng trong ngôn ngữ lập trình đa dụng. Nếu bạn khắc phục chúng, bạn sẽ gặp phải trường hợp như MUMPS, trong đó sự vướng víu của hai kết quả trong toàn bộ ngành công nghiệp bị sa lầy trong một vấn đề gà và trứng, bị mắc kẹt với một DBMS lỗi thời và ngôn ngữ lập trình lỗi thời.


0

Được sử dụng để hoạt động trong NonStop / SQL được tích hợp hoàn toàn vào NonStop / C, NonStop / C ++, NonStop / Cobol, NonStop / Fortran và có lẽ các ngôn ngữ khác cũng như được tích hợp hoàn toàn với NonStop / Guardian, hệ điều hành mà các máy tính trên đó chạy.

Tôi nghĩ đó có lẽ là sự tích hợp gần nhất mà bạn có thể nhận được, trong đó cơ sở dữ liệu là hệ thống tập tin của hệ điều hành. Đó cũng là một ngõ cụt, không có cách nào để tách rời bất kỳ thành phần nào, cơ sở dữ liệu, hệ điều hành, phần cứng và bất kỳ phần mềm nào được viết trên đó không bao giờ có thể được sử dụng riêng rẽ, chuyển sang môi trường khác.

Gần nhất bạn sẽ có trên PC có thể là MS Access, Embarcadero / Borland Delphi là một thứ hai gần gũi.

Sau đó, bạn đang xem các cơ sở dữ liệu nhúng trong ứng dụng của mình, điều này có thể thu hút giới hạn đối với những người tạo các ứng dụng độc lập cần một tập hợp dữ liệu phân cấp không dễ dàng lưu trữ trong tệp cấu hình đơn giản và / hoặc cần cập nhật thường xuyên khi ứng dụng chạy . Hoặc đối với những người muốn có phiên bản di động của ứng dụng duy trì ảnh chụp nhanh một phần của cơ sở dữ liệu lớn hơn và có thể đồng bộ hóa với cơ sở dữ liệu lớn hơn vào thời điểm ứng dụng có thể kết nối (tiện dụng để nói rằng một nhân viên bán hàng thường ở ngoài tầm với mạng công ty vẫn cần dữ liệu bán hàng cho nhóm khách hàng của anh ấy hoặc bác sĩ trong lĩnh vực muốn có hồ sơ bệnh nhân nhưng không thể kết nối với mạng bệnh viện vì không có mạng truy cập nơi anh ấy phải đến).


0

Là cựu nhà phát triển Visual Foxpro, tôi thấy khó hiểu là không có ngôn ngữ chính nào định nghĩa mô hình quan hệ là một phần của ngôn ngữ.

Có công cụ cơ sở dữ liệu đầy đủ không phải là ý tưởng hay, nhưng thay vào đó, có ngôn ngữ "SQL" có thể RẤT hữu ích.

Trong OO, tồn tại sự không phù hợp trở kháng. Điều này xảy ra vì các đối tượng và thiết lập không thích nhau. Nhưng nếu một ngôn ngữ cho phép tôi xác định BẢNG, L FINH VỰC, MỐI QUAN HỆ, CONSTRAINS, v.v. (không ràng buộc nó với một bộ lưu trữ cụ thể) sẽ rất mạnh mẽ. Thêm vào đó, việc tạo một ORM sẽ có nhiều ánh xạ 1-1 hơn.

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.