Tại sao cơ sở dữ liệu quan hệ không hỗ trợ trả về thông tin theo định dạng lồng nhau?


46

Giả sử tôi đang xây dựng một blog mà tôi muốn có bài viết và bình luận. Vì vậy, tôi tạo hai bảng, bảng 'bài đăng' với cột 'id' số nguyên tự động và bảng 'nhận xét' có khóa ngoại 'post_id'.

Sau đó, tôi muốn chạy cái có lẽ sẽ là truy vấn phổ biến nhất của tôi, đó là lấy một bài đăng và tất cả các bình luận của nó. Là khá mới đối với cơ sở dữ liệu quan hệ, cách tiếp cận có vẻ rõ ràng nhất đối với tôi là viết một truy vấn trông giống như:

SELECT id, content, (SELECT * FROM comments WHERE post_id = 7) AS comments
FROM posts
WHERE id = 7

Điều này sẽ cung cấp cho tôi id và nội dung của bài đăng mà tôi muốn, cùng với tất cả các hàng nhận xét có liên quan được đóng gói gọn gàng trong một mảng (một đại diện lồng nhau như bạn sử dụng trong JSON). Tất nhiên, SQL và cơ sở dữ liệu quan hệ không hoạt động như thế này và gần nhất họ có thể nhận được là tham gia giữa 'bài đăng' và 'nhận xét' sẽ trả lại nhiều dữ liệu trùng lặp không cần thiết (với cùng một thông tin bài đăng được lặp lại trong mỗi hàng), có nghĩa là thời gian xử lý được dành cả trên cơ sở dữ liệu để kết hợp tất cả lại với nhau và trên ORM của tôi để phân tích và hoàn tác tất cả.

Ngay cả khi tôi hướng dẫn ORM của mình háo hức tải các bình luận của bài đăng, thì cách tốt nhất là gửi một truy vấn cho bài đăng, sau đó truy vấn thứ hai để lấy tất cả các bình luận, sau đó đặt chúng ở phía khách hàng cũng không hiệu quả.

Tôi hiểu rằng cơ sở dữ liệu quan hệ là công nghệ đã được chứng minh (địa ngục, chúng lớn hơn tôi) và rằng đã có rất nhiều nghiên cứu được đưa vào chúng trong nhiều thập kỷ và tôi chắc chắn có lý do thực sự tốt tại sao chúng (và Tiêu chuẩn SQL) được thiết kế để hoạt động theo cách họ làm, nhưng tôi không chắc tại sao cách tiếp cận tôi nêu ở trên là không thể. Nó dường như là cách đơn giản và rõ ràng nhất để thực hiện một trong những mối quan hệ cơ bản nhất giữa các hồ sơ. Tại sao cơ sở dữ liệu quan hệ không cung cấp một cái gì đó như thế này?

(Tuyên bố miễn trừ trách nhiệm: Tôi chủ yếu viết các ứng dụng web bằng cách sử dụng kho dữ liệu Rails và NoQuery, nhưng gần đây tôi đã dùng thử Postgres và tôi thực sự thích nó rất nhiều.

Tôi không hỏi làm thế nào để tối ưu hóa ứng dụng Rails, hay cách khắc phục vấn đề này trong một cơ sở dữ liệu cụ thể. Tôi đang hỏi tại sao tiêu chuẩn SQL hoạt động theo cách này khi nó có vẻ trái ngược và lãng phí đối với tôi. Phải có một số lý do lịch sử tại sao các nhà thiết kế ban đầu của SQL muốn kết quả của họ trông như thế này.


1
không phải tất cả các orms hoạt động theo cách đó. hibernate / nhibernate cho phép các phép nối được chỉ định và có thể háo hức tải toàn bộ cây đối tượng từ một truy vấn duy nhất.
nathan gonzalez

1
Ngoài ra, trong khi một điểm thảo luận thú vị, tôi không chắc điều này thực sự có thể trả lời được nếu không có cuộc gặp với những người đàn ông ansi sql
nathan gonzalez

@nathan: Vâng, không phải tất cả. Tôi đã sử dụng Sequel cho phép bạn chọn cách tiếp cận nào bạn thích cho một truy vấn nhất định ( tài liệu ), nhưng họ vẫn khuyến khích cách tiếp cận nhiều truy vấn (vì lý do hiệu suất, tôi cho rằng).

5
Bởi vì RDBMS được thiết kế để lưu trữ và truy xuất các bộ - nó không có ý định trả lại dữ liệu để hiển thị. Hãy nghĩ về nó giống như MVC - tại sao nó sẽ cố gắng thực hiện chế độ xem với chi phí làm cho mô hình chậm hơn hoặc khó sử dụng hơn? RDBMS cung cấp các lợi ích mà cơ sở dữ liệu NoQuery không thể (và ngược lại là visa) - nếu bạn đang sử dụng nó vì đây là công cụ phù hợp để giải quyết vấn đề của bạn, bạn sẽ không yêu cầu nó trả lại dữ liệu sẵn sàng để hiển thị.

1
Họ thấy cho xml
Ian

Câu trả lời:


42

Ngày CJ đi sâu vào chi tiết về điều này trong Chương 7 và Phụ lục B của SQL và Lý thuyết quan hệ . Bạn nói đúng, không có gì trong lý thuyết quan hệ cấm loại dữ liệu của thuộc tính là chính mối quan hệ, miễn là nó có cùng loại quan hệ trên mỗi hàng. Ví dụ của bạn sẽ đủ điều kiện.

Nhưng Date nói rằng các cấu trúc như thế này là "thường - nhưng không phải lúc nào cũng bị chống chỉ định" (tức là một ý tưởng tồi) bởi vì hệ thống phân cấp của các mối quan hệ là không đối xứng . Ví dụ, một chuyển đổi từ cấu trúc lồng nhau sang cấu trúc "phẳng" quen thuộc không thể luôn luôn được đảo ngược để tạo lại lồng.

Các truy vấn, ràng buộc và cập nhật phức tạp hơn, khó viết hơn và RDBMS khó hỗ trợ hơn nếu bạn cho phép các thuộc tính có giá trị quan hệ (RVA).

Nó cũng làm vấy bẩn các nguyên tắc thiết kế cơ sở dữ liệu, bởi vì hệ thống phân cấp tốt nhất của các mối quan hệ không quá rõ ràng. Chúng ta có nên thiết kế mối quan hệ của Nhà cung cấp với RVA lồng nhau cho các bộ phận được cung cấp bởi Nhà cung cấp nhất định không? Hoặc mối quan hệ của các Bộ phận với RVA lồng nhau cho các nhà cung cấp cung cấp một Phần nhất định? Hoặc lưu trữ cả hai, để dễ dàng chạy các loại truy vấn khác nhau?

Đây là vấn đề nan giải tương tự xảy ra từ cơ sở dữ liệu phân cấp và các mô hình cơ sở dữ liệu hướng tài liệu . Cuối cùng, sự phức tạp và chi phí của việc truy cập các cấu trúc dữ liệu lồng nhau khiến các nhà thiết kế lưu trữ dữ liệu dư thừa để tìm kiếm dễ dàng hơn bằng các truy vấn khác nhau. Mô hình quan hệ không khuyến khích dự phòng, do đó, RVA có thể hoạt động chống lại các mục tiêu của mô hình quan hệ.

Từ những gì tôi hiểu (tôi chưa sử dụng chúng), RelDataphor là các dự án RDBMS hỗ trợ các thuộc tính có giá trị quan hệ.


Nhận xét lại từ @dportas:

Các kiểu cấu trúc là một phần của SQL-99 và Oracle hỗ trợ các kiểu này. Nhưng họ không lưu trữ nhiều bộ dữ liệu trong bảng lồng nhau trên mỗi hàng của bảng cơ sở. Ví dụ phổ biến là một thuộc tính "địa chỉ" dường như là một cột duy nhất của bảng cơ sở, nhưng có thêm các cột phụ cho đường phố, thành phố, mã bưu chính, v.v.

Các bảng lồng nhau cũng được Oracle hỗ trợ và các bảng này cho phép nhiều bộ dữ liệu trên mỗi hàng của bảng cơ sở. Nhưng tôi không biết rằng đây là một phần của SQL chuẩn. Và hãy ghi nhớ kết luận của một blog: "Tôi sẽ không bao giờ sử dụng bảng lồng nhau trong câu lệnh CREATE TABLE. Bạn dành toàn bộ thời gian của mình để KIỂM TRA chúng để làm cho chúng hữu ích trở lại!"


3
Tôi sẽ không thực sự muốn lưu trữ một mối quan hệ bên trong một mối quan hệ khác - chúng sẽ ở trong các bảng riêng biệt và không chuẩn hóa như bình thường. Tôi chỉ hỏi tại sao kiểu nhúng kết quả này không được phép trong các truy vấn, khi nó có vẻ trực quan hơn với tôi so với mô hình tham gia.
PreciousBodilyFluids

Bộ kết quả và bảng là một loại. Ngày gọi họ là mối quan hệrelvars tương ứng (bằng cách tương tự, 42 tuổi là một số nguyên, trong khi một biến xcó thể có giá trị của số nguyên 42). Các hoạt động tương tự áp dụng cho các mối quan hệ và các mối quan hệ, do đó cấu trúc của chúng cần phải tương thích.
Bill Karwin

2
SQL chuẩn không hỗ trợ các bảng lồng nhau. Chúng được gọi là "các loại có cấu trúc". Oracle là một DBMS có tính năng này.
nvogel

2
Có phải hơi vô lý khi lập luận rằng để tránh trùng lặp dữ liệu, bạn phải viết truy vấn của mình theo cách thức sao chép dữ liệu phẳng?
Eamon Nerbonne

1
@EamonNerbonne, tính đối xứng của các hoạt động quan hệ. Ví dụ, chiếu. Nếu tôi CHỌN một số thuộc tính phụ ra khỏi RVA, làm thế nào tôi có thể áp dụng thao tác ngược với tập kết quả để tái tạo cấu trúc phân cấp ban đầu? Tôi đã tìm thấy trang 293 của cuốn sách Date trên Google Books, vì vậy bạn có thể thấy những gì anh ấy đã viết: Books.google.com/,
Bill Karwin

15

Một số hệ thống cơ sở dữ liệu sớm nhất dựa trên mô hình Cơ sở dữ liệu phân cấp . Điều này thể hiện dữ liệu trong một cấu trúc giống như cây với cha mẹ và con cái, giống như bạn đang đề xuất ở đây. HDMS chủ yếu được thay thế bởi các cơ sở dữ liệu được xây dựng theo mô hình quan hệ. Lý do chính cho điều này là RDBMS có thể mô hình hóa các mối quan hệ "nhiều đến nhiều" gây khó khăn cho cơ sở dữ liệu phân cấp và RDBMS có thể dễ dàng thực hiện các truy vấn không phải là một phần của thiết kế ban đầu trong khi HDBMS buộc bạn phải truy vấn thông qua các đường dẫn được chỉ định tại thời điểm thiết kế.

Vẫn còn một số ví dụ về các hệ thống cơ sở dữ liệu phân cấp trong tự nhiên, đặc biệt là sổ đăng ký Windows và LDAP.

Phạm vi bao quát của chủ đề này có sẵn trong bài viết sau


10

Tôi cho rằng câu hỏi của bạn thực sự tập trung vào thực tế là trong khi cơ sở dữ liệu dựa trên logic vững chắc và đặt cơ sở trị liệu và họ làm rất tốt việc lưu trữ, thao tác và truy xuất dữ liệu trong các bộ (2 chiều) trong khi vẫn đảm bảo tính toàn vẹn tham chiếu, đồng thời và nhiều thứ khác, chúng không cung cấp tính năng (bổ sung) gửi dữ liệu (và nhận) theo cách mà người ta có thể gọi là định dạng hướng đối tượng hoặc định dạng phân cấp.

Sau đó, bạn tuyên bố rằng "ngay cả khi tôi hướng dẫn ORM của mình háo hức tải bình luận của bài đăng, cách tốt nhất là gửi một truy vấn cho bài đăng, sau đó truy vấn thứ hai để truy xuất tất cả các bình luận, sau đó đặt chúng lại với nhau phía khách hàng, cũng không hiệu quả " .

Tôi không thấy bất cứ điều gì không hiệu quả trong việc gửi 2 truy vấn và nhận 2 lô kết quả với:

--- Query-1-posts
SELECT id, content 
FROM posts
WHERE id = 7


--- Query-2-comments
SELECT * 
FROM comments 
WHERE post_id = 7

Tôi cho rằng đó là (gần như) cách hiệu quả nhất (gần như, vì bạn không thực sự cần posts.idvà không phải tất cả các cột từ đó comments.*)

Như Todd đã chỉ ra trong nhận xét của mình, bạn không nên yêu cầu cơ sở dữ liệu trả về dữ liệu sẵn sàng để hiển thị. Đó là công việc của ứng dụng để làm điều đó. Bạn có thể viết (một hoặc một vài) truy vấn để nhận kết quả bạn cần cho mọi thao tác hiển thị để không có sự trùng lặp không cần thiết trong dữ liệu được gửi qua dây (hoặc bus bộ nhớ) từ db đến ứng dụng.

Tôi không thể nói về ORM thực sự nhưng có lẽ một số người trong số họ có thể làm một phần công việc này cho chúng tôi.

Các kỹ thuật tương tự có thể được sử dụng trong việc phân phối dữ liệu giữa máy chủ web và máy khách. Các kỹ thuật khác (như bộ nhớ đệm) được sử dụng để cơ sở dữ liệu (hoặc web hoặc máy chủ khác) không bị quá tải với các yêu cầu trùng lặp.

Tôi đoán là các tiêu chuẩn, như SQL, là tốt nhất nếu chúng duy trì chuyên môn trong một lĩnh vực và không cố gắng bao quát tất cả các lĩnh vực của một lĩnh vực.

Mặt khác, phần thưởng đặt ra tiêu chuẩn SQL cũng có thể nghĩ khác trong tương lai và cung cấp sự phù hợp cho một tính năng bổ sung như vậy. Nhưng nó không phải là thứ có thể được thiết kế trong một đêm.


1
Tôi có nghĩa là không hiệu quả theo nghĩa là ứng dụng của tôi phải chịu chi phí chung và trì hoãn hai cuộc gọi cơ sở dữ liệu thay vì chỉ một cuộc gọi. Bên cạnh đó, không tham gia cũng chỉ trả lại dữ liệu ở định dạng sẵn sàng để hiển thị? Hoặc sử dụng một khung nhìn cơ sở dữ liệu? Bạn cũng có thể loại bỏ chúng bằng cách chạy nhiều truy vấn nhỏ hơn và ghép chúng lại với nhau trong ứng dụng của bạn, nếu bạn muốn, nhưng chúng vẫn là những công cụ hữu ích. Tôi không nghĩ những gì tôi đề xuất khác biệt đáng kể so với việc tham gia, ngoài việc dễ sử dụng hơn và hiệu quả hơn.

2
@Precious: Không cần phải tăng thêm chi phí để chạy nhiều truy vấn. Hầu hết các cơ sở dữ liệu cho phép bạn gửi nhiều truy vấn trong một đợt và nhận nhiều bộ kết quả từ một truy vấn.
Daniel Pryden

@PreciousBodilyFluids - Đoạn mã SQL trong câu trả lời của ypercube là một truy vấn duy nhất sẽ được gửi trong một cuộc gọi cơ sở dữ liệu và trả về hai tập kết quả trong một phản hồi.
Carson63000

5

Tôi không thể trả lời bằng một câu trả lời đúng, có lý lẽ, vì vậy hãy thoải mái hạ bệ tôi vào quên lãng nếu tôi sai (nhưng xin vui lòng sửa cho tôi để chúng tôi có thể học được điều gì đó mới). Tôi nghĩ rằng lý do là các cơ sở dữ liệu quan hệ được tập trung vào mô hình quan hệ, đến lượt nó dựa trên một cái gì đó tôi không biết gì về "logic thứ tự đầu tiên". Những gì bạn có thể yêu cầu có thể không phù hợp về mặt khái niệm trong cơ sở dữ liệu quan hệ khung toán học / logic được xây dựng dựa trên. Hơn nữa, những gì bạn yêu cầu thường được giải quyết dễ dàng bằng cơ sở dữ liệu đồ thị, đưa ra nhiều gợi ý rằng đó là khái niệm cơ bản của cơ sở dữ liệu mâu thuẫn với những gì bạn muốn đạt được.


5

Tôi biết ít nhất SQLServer không hỗ trợ các truy vấn lồng nhau khi bạn sử dụng FOR XML.

SELECT id, content, (SELECT * FROM comments WHERE post_id = posts.id FOR XML PATH('comments'), TYPE) AS comments
FROM posts
WHERE id = 7
FOR XML PATH('posts')

Vấn đề ở đây không phải là thiếu sự hỗ trợ từ RDBMS, mà là thiếu sự hỗ trợ của các bảng lồng nhau trong các bảng.

Bên cạnh, điều gì ngăn bạn sử dụng một tham gia bên trong?

SELECT id, content, comments.*
FROM posts inner join comments on comments.post_id = posts.id
WHERE id = 7

Bạn thực sự có thể xem liên kết bên trong dưới dạng bảng lồng nhau, chỉ có nội dung của 2 trường đầu tiên được lặp lại một lần có thể. Tôi sẽ không lo lắng về hiệu suất của việc tham gia nhiều, phần chậm duy nhất trong truy vấn như thế này là io từ cơ sở dữ liệu đến máy khách. Đây sẽ chỉ là một vấn đề khi nội dung chứa một lượng lớn dữ liệu. Trong trường hợp đó tôi sẽ đề xuất hai truy vấn, một với select id, contentvà một với nối bên trong và select posts.id, comments.*. Tỷ lệ này thậm chí với nhiều bài đăng, vì bạn vẫn sẽ chỉ sử dụng 2 truy vấn.


Các câu hỏi giải quyết điều này. Hoặc bạn phải thực hiện hai chuyến đi khứ hồi (không tối ưu) hoặc bạn phải trả lại dữ liệu dư thừa trong hai cột đầu tiên (cũng không tối ưu). Anh ấy muốn giải pháp tối ưu (theo ý kiến ​​của tôi không thực tế).
Scott Whitlock

Tôi biết, nhưng không có điều gì là một giải pháp tối ưu. Điều duy nhất tôi có thể tranh luận là nơi mà chi phí sẽ tối thiểu và nơi nó phụ thuộc vào. Nếu bạn muốn giải pháp tối ưu, điểm chuẩn và thử các cách tiếp cận khác nhau. Ngay cả giải pháp XML có thể chậm hơn tùy thuộc vào tình huống cụ thể và tôi không quen với kho dữ liệu NoQuery vì vậy tôi không thể nói nếu nó có cái gì đó tương tự như for xml.
Dorus

5

Trên thực tế, Oracle hỗ trợ những gì bạn muốn nhưng bạn cần bọc truy vấn phụ bằng từ khóa "con trỏ". Kết quả được tìm nạp thông qua con trỏ mở. Trong Java, ví dụ các bình luận sẽ hiển thị dưới dạng tập kết quả. Thông tin thêm về điều này xem tài liệu của Oracle về "Biểu hiện HIỆN TẠI"

SELECT id, content, cursor(SELECT * FROM comments WHERE post_id = 7) AS comments
FROM posts
WHERE id = 7

1

Một số làm hỗ trợ lồng nhau (phân cấp).

Nếu bạn muốn một truy vấn, bạn có thể có một bảng tự tham chiếu chính nó. Một số RDMS hỗ trợ khái niệm này. Ví dụ: với SQL Server, người ta có thể sử dụng Biểu thức bảng chung (CTE) cho truy vấn phân cấp.

Trong trường hợp của bạn, Bài viết sẽ ở Cấp độ 0 và sau đó tất cả các nhận xét sẽ ở Cấp độ 1.

Các tùy chọn khác là 2 truy vấn hoặc Tham gia với một số thông tin bổ sung cho mỗi bản ghi được trả về (mà những người khác đã đề cập).

Ví dụ về phân cấp:

https://stackoverflow.com/questions/14274942/sql-server-cte-and-recursion-example

Trong liên kết trên, EmpLevel hiển thị mức độ lồng nhau (hoặc phân cấp).


Tôi không thể tìm thấy bất kỳ tài liệu nào về các kết quả phụ trong SQL Server. Ngay cả khi sử dụng CTE. Theo kết quả, ý tôi là các hàng dữ liệu với các cột được gõ đủ mạnh. Bạn có thể thêm tài liệu tham khảo cho câu trả lời của bạn?
SandRock

@SandRock - Cơ sở dữ liệu sẽ gửi lại một kết quả được đặt lại từ Truy vấn SQL. Bằng cách xác định các mức trong chính truy vấn, bạn có thể tạo một tập kết quả phân cấp hoặc lồng nhau sẽ được xử lý. Tôi nghĩ hiện tại đó là gần nhất chúng ta sẽ có được để trả về dữ liệu được lồng.
Jon Raynor

0

Tôi xin lỗi tôi không chắc tôi hiểu chính xác vấn đề của bạn.

Trong MSSQL, bạn chỉ có thể thực thi 2 Báo cáo SQL.

SELECT id, content
FROM posts
WHERE id = 7

SELECT * FROM comments WHERE post_id = 7

Và nó sẽ trả về 2 bộ kết quả của bạn cùng một lúc.


Người đặt câu hỏi nói rằng điều này kém hiệu quả hơn vì nó dẫn đến hai chuyến đi khứ hồi đến cơ sở dữ liệu và chúng tôi thường cố gắng giảm thiểu các chuyến đi khứ hồi vì chi phí quá cao. Anh ấy muốn thực hiện một chuyến đi khứ hồi và lấy lại cả hai bàn.
Scott Whitlock

Nhưng nó sẽ là một chuyến đi khứ hồi. stackoverflow.com/questions/2336362/ cường
Biff MaGriff

0

RDBM dựa trên lý thuyết và chúng bám sát lý thuyết. Điều này cho phép một số tính nhất quán tốt đẹp và độ tin cậy đã được chứng minh về mặt toán học.

Bởi vì mô hình này đơn giản và một lần nữa dựa trên lý thuyết, nó giúp mọi người dễ dàng thực hiện tối ưu hóa và nhiều triển khai. Điều này không giống như NoQuery nơi mọi người làm nó hơi khác nhau.

Trước đây đã có những nỗ lực để tạo cơ sở dữ liệu phân cấp nhưng IIRC (dường như không thể google nó) đã có vấn đề (chu kỳ và sự bình đẳng xuất hiện trong tâm trí).


0

Bạn có một nhu cầu cụ thể. Nó sẽ được ưu tiên trích xuất dữ liệu ra khỏi cơ sở dữ liệu theo định dạng bạn muốn, vì vậy bạn có thể làm với nó những gì bạn muốn.

Một số điều cơ sở dữ liệu không làm tốt như vậy, nhưng dù sao việc xây dựng chúng để làm điều đó không phải là không thể. Rời khỏi việc hình thành các ứng dụng khác là khuyến nghị hiện tại, nhưng không thể giải thích được tại sao nó không thể được thực hiện.

Lập luận duy nhất tôi có chống lại đề nghị của bạn là có thể xử lý kết quả này được đặt theo cách "sql". Sẽ là một ý tưởng tồi khi tạo ra một kết quả trong cơ sở dữ liệu mà không thể làm việc với nó hoặc thao tác với nó ở một mức độ nào đó. Giả sử tôi đã tạo một chế độ xem được xây dựng theo cách bạn đề xuất, làm cách nào để đưa nó vào một tuyên bố chọn khác? Cơ sở dữ liệu muốn lấy kết quả và làm mọi thứ với chúng. Làm thế nào tôi có thể tham gia nó vào một bảng khác? Làm thế nào tôi có thể so sánh kết quả của bạn với một cái khác?

Sau đó, lợi ích của RDMS là tính linh hoạt của sql. Cú pháp chọn dữ liệu từ một bảng khá gần với danh sách người dùng hoặc các đối tượng khác trong hệ thống (Ít nhất đó là mục tiêu.). Không chắc chắn có bất kỳ điểm nào để làm một cái gì đó hoàn toàn khác biệt. Họ thậm chí còn không đưa họ đến điểm xử lý mã / con trỏ thủ tục hoặc BLOBS dữ liệu rất hiệu quả.


0

Theo tôi, phần lớn là do SQL và cách thức thực hiện các truy vấn tổng hợp - các hàm tổng hợp và nhóm được thực hiện trên các hàng 2 chiều lớn để trả về kết quả. Đó là cách nó đã có từ đầu và nó rất nhanh (hầu hết các giải pháp NoQuery khá chậm với tổng hợp và dựa vào lược đồ không chuẩn hóa thay vì các truy vấn phức tạp)

Tất nhiên PostgreSQL có một số tính năng từ cơ sở dữ liệu hướng đối tượng. Theo thư này ( tin nhắn ), bạn có thể đạt được những gì bạn cần bằng cách tạo tổng hợp tùy chỉnh.

Cá nhân tôi đang sử dụng các khung như Doctrine ORM (PHP) để thực hiện các tính năng hỗ trợ và ứng dụng tổng hợp như tải nhanh để tăng hiệu suất.


0

PostgreSQL hỗ trợ nhiều loại dữ liệu có cấu trúc, bao gồm MảngJSON . Sử dụng SQL hoặc một trong các ngôn ngữ thủ tục được nhúng, bạn có thể xây dựng các giá trị với cấu trúc phức tạp tùy ý và trả chúng về ứng dụng của bạn. Bạn cũng có thể tạo các bảng với các cột thuộc bất kỳ loại có cấu trúc nào, mặc dù vậy bạn nên xem xét cẩn thận xem bạn có cần thiết không chuẩn hóa thiết kế của mình không.


1
điều này dường như không cung cấp bất cứ điều gì đáng kể qua các điểm được thực hiện và giải thích trong 13 câu trả lời trước
gnat

Câu hỏi đặc biệt đề cập đến JSON và câu trả lời này là câu hỏi duy nhất chỉ ra rằng JSON có thể được trả về trong các truy vấn từ ít nhất một RDBMS. Tôi thà nhận xét về câu hỏi để nói rằng nó dựa trên tiền đề sai và do đó không thể mong đợi bất kỳ câu trả lời dứt khoát nào. Tuy nhiên, StackExchange sẽ không cho phép tôi làm điều đó.
Jonathan Rogers
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.