Chế độ xem tốt cho điều gì?


87

Tôi chỉ đang cố gắng có được một ý tưởng chung về những gì các khung nhìn được sử dụng trong RDBMS. Có nghĩa là, tôi biết chế độ xem là gì và cách tạo chế độ xem. Tôi cũng biết tôi đã sử dụng chúng để làm gì trong quá khứ.

Nhưng tôi muốn đảm bảo rằng tôi đã hiểu cặn kẽ về những gì một chế độ xem hữu ích và những gì một chế độ xem không nên hữu ích. Cụ thể hơn:

  1. Chế độ xem hữu ích cho điều gì?
    • Có bất kỳ tình huống nào khiến bạn muốn sử dụng chế độ xem khi không nên sử dụng chế độ xem không?
    • Tại sao bạn lại sử dụng một dạng xem thay cho một cái gì đó như một hàm có giá trị bảng hoặc ngược lại?
    • Có bất kỳ trường hợp nào mà một chế độ xem có thể hữu ích mà thoạt nhìn không rõ ràng không?

(Và đối với hồ sơ, một số câu hỏi này là cố ý ngây thơ. Đây một phần là kiểm tra khái niệm.)


1
tương tự như câu hỏi được đăng ở đây: stackoverflow.com/questions/1278521/…
MedicineMan

Tôi cảm thấy stackoverflow.com/questions/1278521/… cung cấp câu trả lời tốt hơn cho câu hỏi này.
GinTonic

Câu trả lời:


42

1) Chế độ xem hữu ích cho điều gì?

IOPO Chỉ Tại Một Nơi

• Cho dù bạn xem xét bản thân dữ liệu hay các truy vấn tham chiếu đến các bảng đã kết hợp, việc sử dụng dạng xem sẽ tránh được sự dư thừa không cần thiết.

• Các khung nhìn cũng cung cấp một lớp trừu tượng ngăn cản việc truy cập trực tiếp vào các bảng (và kết quả là kết quả còng tham chiếu các phụ thuộc vật lý). Trong thực tế, tôi nghĩ rằng đó là thực hành tốt 1 để cung cấp truy cập chỉ tóm tắt số liệu cơ bản của bạn (sử dụng xem & chức năng bảng giá trị), trong đó có quan điểm như vậy như 1 Tôi hafta thừa nhận có một việc tốt của "Đỗ như tôi nói, không như tôi làm "trong lời khuyên đó;)

CREATE VIEW AS
      SELECT * FROM tblData


2) Có bất kỳ tình huống nào khiến bạn muốn sử dụng chế độ xem khi không nên sử dụng chế độ xem không?

Kết nối hiệu suất trong chế độ xem từng là mối quan tâm (ví dụ: SQL 2000). Tôi không phải là chuyên gia, nhưng tôi đã không lo lắng về nó trong một thời gian. (Tôi cũng không thể nghĩ về nơi hiện tại tôi đang sử dụng các phép nối chế độ xem.)

Một tình huống khác mà một chế độ xem có thể quá mức cần thiết là khi chế độ xem chỉ được tham chiếu từ một vị trí đang gọi và một bảng dẫn xuất có thể được sử dụng thay thế. Giống như kiểu ẩn danh được ưu tiên cho một lớp trong .NET nếu kiểu ẩn danh chỉ được sử dụng / tham chiếu một lần.

    • Xem mô tả bảng dẫn xuất trong http://msdn.microsoft.com/en-us/library/ms177634.aspx

3) Tại sao bạn lại sử dụng một dạng xem thay cho một cái gì đó như một hàm có giá trị bảng hoặc ngược lại?

(Ngoài lý do hiệu suất) Một hàm có giá trị bảng tương đương về mặt chức năng với dạng xem tham số hóa. Trên thực tế, một trường hợp sử dụng hàm có giá trị bảng đơn giản phổ biến chỉ là thêm bộ lọc mệnh đề WHERE vào dạng xem đã tồn tại trong một đối tượng.

4) Có bất kỳ trường hợp nào mà một khung nhìn có thể hữu ích mà thoạt nhìn không rõ ràng không?

Tôi không thể nghĩ ra bất kỳ công dụng không rõ ràng nào của đỉnh đầu của mình. (Tôi cho rằng nếu tôi có thể, điều đó sẽ làm cho họ rõ ràng;)

9
Tôi sẽ không đồng ý rằng việc tạo một khung nhìn trên bảng là hợp lý khi nó là một dữ liệu SELECT * FROM tblData. Bạn có thể đưa ra lời giải thích tại sao điều này sẽ có lợi không?
Người dùng đã đăng ký

IOPO - In One Place Only - Đây có phải là một cụm từ thiết kế nổi tiếng không? Tôi dường như không thể tìm thấy nhiều tài liệu tham khảo về nó? Nó có các dạng khác, ví dụ như KHÔ?
Robert,

1
@Robert Vâng, DRY, normalization, IOPO, đây là những hương vị khác nhau của cùng một triết lý.
TylerH

45

Theo một cách nào đó, một khung nhìn giống như một giao diện. Bạn có thể thay đổi cấu trúc bảng bên dưới tất cả những gì bạn muốn, nhưng chế độ xem cung cấp một cách để mã không phải thay đổi.

Lượt xem là một cách hay để cung cấp thông tin đơn giản cho người viết báo cáo. Nếu người dùng doanh nghiệp của bạn muốn truy cập dữ liệu từ một cái gì đó như Crystal Reports, bạn có thể cung cấp cho họ một số chế độ xem trong tài khoản của họ để đơn giản hóa dữ liệu - thậm chí có thể không chuẩn hóa dữ liệu cho họ.


21

Chế độ xem có thể được sử dụng để cung cấp bảo mật (nghĩa là: người dùng có thể có quyền truy cập vào các chế độ xem chỉ truy cập vào các cột nhất định trong bảng), các chế độ xem có thể cung cấp bảo mật bổ sung cho các bản cập nhật, chèn, v.v. Chế độ xem cũng cung cấp một cách đến tên cột bí danh (như vậy sp's) nhưng các khung nhìn là một sự cô lập với bảng thực tế.


18

Theo một nghĩa nào đó, các khung nhìn không chuẩn hóa. Chuẩn hóa đôi khi là cần thiết để cung cấp dữ liệu theo cách có ý nghĩa hơn. Đây là điều mà rất nhiều ứng dụng làm bằng cách lập mô hình miền trong các đối tượng của chúng. Chúng giúp trình bày dữ liệu theo cách phù hợp hơn với quan điểm của doanh nghiệp.


-1 "lượt xem không chuẩn hóa"? xin lỗi, nhưng điều đó vô nghĩa trừ khi nó đủ điều kiện bằng cách nào đó.
chỉ ai đó

18
Họ hoàn toàn không chuẩn hóa. Nếu bạn có các bảng liên quan được chuẩn hóa thành dạng đề cử thứ 3 và bạn tạo một dạng xem để 'làm phẳng' mối quan hệ đó, thì làm thế nào đây không phải là chuẩn hóa?
Kilhoffer

11

Ngoài những gì những người khác đã nêu, các khung nhìn cũng có thể hữu ích để loại bỏ các truy vấn SQL hoàn chỉnh hơn khỏi ứng dụng.

Ví dụ, thay vì trong một ứng dụng làm:

sql = "select a, b from table1 union select a, b from table2";

Bạn có thể tóm tắt nó thành một dạng xem:

tạo chế độ xem union_table1_table2_v khi
chọn a, b từ table1
union
chọn a, b từ table2

và trong mã ứng dụng, chỉ cần có:

sql = "chọn a, b từ union_table1_table2_v";

Ngoài ra, nếu cấu trúc dữ liệu thay đổi, bạn sẽ không phải thay đổi mã ứng dụng, biên dịch lại và triển khai lại. bạn chỉ cần thay đổi chế độ xem trong db.


Tại sao tôi nên viết sql phức tạp trong cơ sở dữ liệu thay vì ứng dụng?
Ivan Virabyan,

3
Truy vấn của bạn càng phức tạp thì càng có nhiều khả năng thay đổi trong tương lai, một phần là do nó chỉ đánh vào nhiều bảng hơn. Khi cấu trúc DB thay đổi, bạn cũng sẽ phải thay đổi mã của mình và thực hiện phát hành. Nếu độ phức tạp đó được trừu tượng hóa trong một dạng xem, DBA có thể thực hiện các thay đổi cấu trúc đối với các bảng bên dưới mà mã của bạn không cần phải thay đổi.
CodingWithSpike

11

Chế độ xem ẩn sự phức tạp của cơ sở dữ liệu. Chúng tuyệt vời vì nhiều lý do và hữu ích trong nhiều trường hợp, nhưng nếu bạn có người dùng được phép viết truy vấn và báo cáo của riêng họ, bạn có thể sử dụng chúng như một biện pháp bảo vệ để đảm bảo rằng họ không trình các truy vấn có liên kết cartesian khó chịu làm hỏng máy chủ cơ sở dữ liệu của bạn.


6

OP đã hỏi rằng liệu có những tình huống mà việc sử dụng chế độ xem có thể bị hấp dẫn nhưng không thích hợp.

Những gì bạn không muốn sử dụng một dạng xem là thay thế cho các phép nối phức tạp. Đó là, đừng để thói quen lập trình thủ tục của bạn chia nhỏ vấn đề thành nhiều phần nhỏ hơn dẫn bạn đến việc sử dụng một số chế độ xem được nối với nhau thay vì một phép nối lớn hơn. Làm như vậy sẽ giết chết hiệu quả của công cụ cơ sở dữ liệu vì nó về cơ bản thực hiện một số truy vấn riêng biệt thay vì một truy vấn lớn hơn.

Ví dụ: giả sử bạn phải nối các bảng A, B, C và D lại với nhau. Bạn có thể bị cám dỗ để tạo một khung nhìn ngoài bảng A & B và một khung nhìn ngoài C & D, sau đó nối hai khung nhìn lại với nhau. Sẽ tốt hơn nhiều nếu chỉ kết hợp A, B, C và D trong một truy vấn.


Tôi không nghĩ điều đó đúng, ít nhất đó không phải là cách lý thuyết DBMS hoạt động (các cách triển khai khác nhau có thể quyết định không tôn trọng lý thuyết). Trình phân tích cú pháp truy vấn về cơ bản sẽ thay thế bất kỳ chế độ xem nào mà nó nhìn thấy bằng sql tương ứng và trình tối ưu hóa sẽ đi từ đó. Hai trường hợp phải tương đương nhau.
SquareCog 18/10/08

Điều này cũng không đúng khi bạn có thể thêm chỉ mục vào chế độ xem của mình.
therealhoff

Tôi quen thuộc nhất với PostgreSQL và các phiên bản trước đó không tốt lắm về việc kết hợp các truy vấn. Nhưng những cái mới hơn tốt hơn nhiều. Câu trả lời của tôi không còn áp dụng nhiều nữa, ít nhất là đối với DBMS cụ thể này.
Barry Brown

5

Chế độ xem có thể tập trung hoặc hợp nhất dữ liệu. Nơi tôi đang ở, chúng tôi có một số cơ sở dữ liệu khác nhau trên một vài máy chủ được liên kết khác nhau. Mỗi cơ sở dữ liệu chứa dữ liệu cho một ứng dụng khác nhau. Một vài trong số những cơ sở dữ liệu đó chứa thông tin liên quan đến một số ứng dụng khác nhau. Những gì chúng ta sẽ làm trong những trường hợp đó là tạo một dạng xem trong cơ sở dữ liệu của ứng dụng đó chỉ lấy dữ liệu từ cơ sở dữ liệu nơi dữ liệu thực sự được lưu trữ, để các truy vấn chúng ta viết không giống như chúng đang đi qua các cơ sở dữ liệu khác nhau.


4

Các phản hồi cho đến nay là đúng - các chế độ xem rất tốt để cung cấp bảo mật, không chuẩn hóa (mặc dù có rất nhiều khó khăn nếu thực hiện sai), trừu tượng hóa mô hình dữ liệu, v.v.

Ngoài ra, các chế độ xem thường được sử dụng để triển khai logic nghiệp vụ (người dùng mất hiệu lực là người dùng đã không đăng nhập trong 40 ngày qua, đại loại là vậy).


nếu bạn không chuẩn hóa bằng cách làm sáng 7 bảng tham chiếu, rồi truy vấn thứ gì đó chỉ cần một trong các bảng tham chiếu đó. Đó là rất nhiều nỗ lực lãng phí. Điều này trở nên tồi tệ hơn nếu bạn bắt đầu tham gia các lượt xem như vậy.
SquareCog 23/10/08

Bạn có chắc về điều này? MSDN cho biết 'Khi SQL Server xử lý các truy vấn tham chiếu đến các khung nhìn theo tên, các định nghĩa của các khung nhìn thường được mở rộng cho đến khi chúng chỉ tham chiếu đến các bảng cơ sở. Quá trình này được gọi là mở rộng khung nhìn. Đó là một dạng mở rộng vĩ mô. ' Tôi sẽ tưởng tượng rằng trong quá trình mở rộng, công cụ sẽ đủ thông minh để chỉ bao gồm các bảng bên dưới (chế độ xem) mà truy vấn cần.
Anthony

Anthony, hãy tưởng tượng một truy vấn chẳng hạn như "select foo_col from (select foo. *, Bar. * From foo join bar on (foo.id = bar.id)". Trong truy vấn này, lựa chọn bên trong là chế độ xem của chúng tôi. Nó không rõ ràng rằng liên kết thanh có thể được loại bỏ một cách an toàn (trên thực tế, nếu mối quan hệ không hoàn toàn là 1-1 thì không thể). Điều này thậm chí còn phức tạp hơn với các truy vấn phức tạp hơn và tôi không khuyên bạn nên dựa vào RDBMS chung để thực hiện tất cả cắt tỉa một con người có thể. Có thể SQL Server có thể; Tôi sẽ bị sốc nếu MySQL làm vậy. Oracle? Postgres? Như mọi khi, hãy đọc kế hoạch truy vấn khi nghi ngờ.
SquareCog 19/10/10

3

Chế độ xem lưu rất nhiều câu lệnh JOIN phức tạp lặp lại trong các tập lệnh SQL của bạn. Bạn chỉ có thể đóng gói một số JOIN phức tạp trong một số dạng xem và gọi nó trong câu lệnh SELECT bất cứ khi nào cần. Điều này đôi khi sẽ tiện dụng, dễ hiểu hơn là viết ra các câu lệnh nối trong mọi truy vấn.


2

Một khung nhìn chỉ đơn giản là một câu lệnh SELECT được lưu trữ, có tên. Hãy nghĩ về các khung nhìn giống như các chức năng thư viện.


Các thủ tục được lưu trữ sẽ không phù hợp hơn cho việc này? Đôi khi bạn cần các chức năng với chế độ xem xóa và cập nhật sẽ không phù hợp với nhu cầu này. Chế độ xem nên được xem như là sự trừu tượng hoặc cách giới hạn người dùng mục tiêu.
HumbleWebDev

1

Tôi muốn làm nổi bật việc sử dụng các chế độ xem để báo cáo. Thông thường, có xung đột giữa việc chuẩn hóa các bảng cơ sở dữ liệu để tăng tốc hiệu suất, đặc biệt là để chỉnh sửa và chèn dữ liệu (sử dụng OLTP) và không chuẩn hóa để giảm số lượng các phép nối bảng cho các truy vấn báo cáo và phân tích (sử dụng OLAP). Tất nhiên, OLTP thường thắng, vì mục nhập dữ liệu phải có hiệu suất tối ưu. Sau đó, tạo chế độ xem để có hiệu suất báo cáo tối ưu, có thể giúp đáp ứng cả hai loại người dùng (người nhập dữ liệu và người xem báo cáo).


1

Tôi nhớ một cuộc CHỌN rất dài liên quan đến một số ĐOÀN KẾT. Mỗi UNION bao gồm một phép nối vào một bảng giá được tạo ngay lập tức bởi một CHỌN mà bản thân nó khá dài và khó hiểu. Tôi nghĩ rằng sẽ là một ý kiến ​​hay nếu bạn có một cái nhìn để tạo bảng giá. Nó sẽ rút ngắn SELECT tổng thể xuống khoảng một nửa.

Tôi không biết liệu DB sẽ đánh giá chế độ xem một lần hay mỗi lần trong được gọi ra. Có ai biết không? Nếu trước đây, sử dụng chế độ xem sẽ cải thiện hiệu suất.


Oracle CBO có thể chọn đánh giá chế độ xem một lần (cụ thể hóa, họ gọi nó là) hoặc hợp nhất SQL cho chế độ xem vào phần còn lại của câu lệnh select và chạy nó. Nó sẽ quyết định dựa trên những gì có chi phí ước tính thấp hơn.
WW.

Nếu câu lệnh select không đổi trong suốt truy vấn và chỉ được lặp lại vài lần thì biểu thức bảng chung (CTE) có thể giải quyết vấn đề. Điều này chỉ áp dụng cho SQL Server 2005/2008 vì nó không có sẵn trong SQL Server 2000. Có, một dạng xem vẫn sẽ được gọi nhiều lần.
Người dùng đã đăng ký

@Registered User: CTE không phải là một đặc sản của SQL Server. Chúng có nguồn gốc từ DB2 và cũng có trong PostgreSQL (vì chúng hữu ích và trong tiêu chuẩn ISO SQL). Cho dù một chế độ xem được nội tuyến hay được coi như một hộp đen đều dành riêng cho việc triển khai, một số RDBMS thông minh hơn những cái khác.
just somebody

@just ai đó: Nhận xét của tôi bị hạn chế đối với SQL Server 2005/2008 vì tôi không có kinh nghiệm với CTE trong RBDMS khác. Ngoài ra, những nhận xét là đủ điều kiện để cho biết điều này không áp dụng cho SQL Server 2000 từ của CTE không có sẵn trong SQL Server trước năm 2005.
Thành Viên

Một cách thay thế khác cho một khung nhìn sẽ là đặt trước bảng giá vào một bảng tạm thời.
SeaDrive

0

Bất cứ lúc nào bạn cần [my_interface]! = [User_interface].

Thí dụ:

BẢNG A:

  • Tôi
  • thông tin

XEM BẢNG A:

  • thông tin khách hàng

đây là một cách bạn có thể ẩn id với khách hàng và đổi tên thông tin thành tên dài dòng hơn cả hai cùng một lúc.

Chế độ xem sẽ sử dụng chỉ mục cơ bản cho id khóa chính, vì vậy bạn sẽ không thấy mất hiệu suất, chỉ là sự trừu tượng hóa tốt hơn của truy vấn chọ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.