보기가 좋은 이유는 무엇입니까?


87

RDBMS에서 어떤 뷰가 사용되는지에 대한 일반적인 아이디어를 얻으려고합니다. 즉, 뷰가 무엇인지, 어떻게 만드는지 압니다. 나는 또한 내가 과거에 무엇을 사용했는지 알고 있습니다.

하지만 뷰가 어떤 용도로 유용하고 어떤 용도로 유용하지 않아야하는지 철저히 이해하고 싶습니다. 더 구체적으로:

  1. 보기가 유용한 이유는 무엇입니까?
    • 뷰를 사용하지 말아야 할 때 뷰를 사용하고 싶은 상황이 있습니까?
    • 테이블 반환 함수와 같은 대신 뷰를 사용하거나 그 반대로 사용하는 이유는 무엇입니까?
    • 한눈에 알 수없는 뷰가 유용 할 수있는 상황이 있습니까?

(기록을 위해 이러한 질문 중 일부는 의도적으로 순진한 것입니다. 이것은 부분적으로 개념 확인입니다.)


1
여기에 게시 된 질문과 유사한 : stackoverflow.com/questions/1278521/…
MedicineMan

나는 stackoverflow.com/questions/1278521/… 이 질문에 더 나은 대답을 제공 한다고 느낍니다 .
GinTonic

답변:


42

1) 뷰가 유용한 이유는 무엇입니까?

IOPO In One Place Only

• 데이터 자체를 고려하든 조인 된 테이블을 참조하는 쿼리를 고려하든 뷰를 활용하면 불필요한 중복을 피할 수 있습니다.

•보기는 또한 테이블에 대한 직접 액세스를 방지하는 추상화 계층을 제공합니다 (그리고 결과적으로 물리적 종속성을 참조하는 handcuffing). 사실, 나는 생각 좋은 연습 1 과 같은 뷰를 포함, (뷰 및 테이블 반환 함수 사용)하여 기본 데이터 만 추상화 된 액세스를 제공하는 1 내가 말한대로 나는 hafta가 할 일 "의 좋은 거래 거기 인정을,하지 I로 그 조언에 "할";)

CREATE VIEW AS
      SELECT * FROM tblData


2) 뷰를 사용하지 말아야 할 때 뷰를 사용하고 싶은 상황이 있습니까?

뷰 조인의 성능이 문제였습니다 (예 : SQL 2000). 나는 전문가는 아니지만 한동안 그것에 대해 걱정하지 않았습니다. (또는 현재 뷰 조인을 사용하고있는 곳을 생각할 수 없습니다.)

뷰가 과도 할 수있는 또 다른 상황은 뷰가 하나의 호출 위치에서만 참조되고 파생 테이블이 대신 사용될 수있는 경우입니다. 익명 유형이 한 번만 사용 / 참조되는 경우 .NET의 클래스보다 익명 유형이 선호되는 것처럼.

    • http://msdn.microsoft.com/en-us/library/ms177634.aspx에서 파생 된 테이블 설명을 참조하십시오.

3) 테이블 반환 함수 대신 뷰를 사용하거나 그 반대의 경우 왜 사용합니까?

(성능 이유 제외) 테이블 반환 함수는 매개 변수가있는 뷰와 기능적으로 동일합니다. 실제로 일반적인 단순 테이블 반환 함수 사용 사례는 단일 개체의 기존 뷰에 WHERE 절 필터를 추가하는 것입니다.

4) 한눈에 알 수없는 뷰가 유용 할 수있는 상황이 있습니까?

나는 내 머리 꼭대기의 명백하지 않은 사용을 생각할 수 없습니다. (내가 할 수 있다면 분명하게 만들 것이라고 생각합니다.)

9
SELECT * FROM tblData 일 때 테이블에 대한 뷰를 만드는 것이 합리적이라는 데 동의하지 않습니다. 이것이 왜 유익한 지 설명해 주시겠습니까?
등록 된 사용자

IOPO-In One Place Only-잘 알려진 디자인 문구입니까? 나는 그것에 대한 많은 참조를 찾을 수없는 것 같습니까? 다른 형태 (예 : DRY)가 있습니까?
Robert

1
@Robert 예, DRY, 정규화, IOPO, 이들은 모두 동일한 철학의 다른 맛입니다.
TylerH

45

어떤면에서 뷰는 인터페이스와 같습니다. 기본 테이블 구조를 원하는대로 변경할 수 있지만 뷰는 코드를 변경할 필요가없는 방법을 제공합니다.

보기는 보고서 작성자에게 간단한 것을 제공하는 좋은 방법입니다. 비즈니스 사용자가 Crystal Reports와 같은 데이터에 액세스하려는 경우 계정에 데이터를 단순화하는 뷰를 제공 할 수 있습니다. 심지어 비정규화할 수도 있습니다.


21

뷰를 사용하여 보안을 제공 할 수 있습니다 (예 : 사용자가 테이블의 특정 열에 만 액세스하는 뷰에 액세스 할 수 있음). 뷰는 업데이트, 삽입 등에 대한 추가 보안을 제공 할 수 있습니다. 뷰는 또한 열 이름을 별칭으로 지정하는 방법을 제공합니다. sp 's) 그러나 뷰는 실제 테이블과 더 분리되어 있습니다.


18

어떤 의미에서 뷰는 비정규 화됩니다. 더 의미있는 방식으로 데이터를 제공하려면 비정규 화가 필요한 경우가 있습니다. 이것은 많은 응용 프로그램이 객체에서 도메인 모델링을 통해 어쨌든 수행하는 작업입니다. 비즈니스 관점에 더 가깝게 일치하는 방식으로 데이터를 제공하는 데 도움이됩니다.


-1 "뷰가 비정규 화"? 미안하지만 자격이없는 한 말도 안되는 일입니다.
단지 누군가

18
그들은 절대적으로 비정규 화합니다. 세 번째 명목 형식으로 정규화 된 관련 테이블이 있고 해당 관계를 '평탄화'하는 뷰를 만드는 경우 이것이 비정규 화가 아닌 이유는 무엇입니까?
Kilhoffer 2010 년

11

다른 사람들이 언급 한 것 외에도 뷰는 응용 프로그램에서 더 복잡한 SQL 쿼리를 제거하는 데 유용 할 수 있습니다.

예를 들어, 응용 프로그램에서 다음을 수행하는 대신 :

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

뷰에 추상화 할 수 있습니다.

같은 뷰 작성 union_table1_table2_v
선택하십시오을, 표 1의 B의
조합은
표 2에서, A, B를 선택

앱 코드에는 다음이 있습니다.

sql = "union_table1_table2_v에서 a, b 선택";

또한 데이터 구조가 변경되는 경우 앱 코드를 변경하고 다시 컴파일하고 다시 배포 할 필요가 없습니다. db에서 뷰를 변경하면됩니다.


왜 앱 대신 데이터베이스에 복잡한 SQL을 작성하고 싶습니까?
이반 Virabyan

3
쿼리가 복잡할수록 나중에 더 많은 테이블에 도달하기 때문에 변경 될 가능성이 높아집니다. DB 구조가 변경되면 코드도 변경하고 릴리스를 수행해야합니다. 이러한 복잡성이 뷰에서 추상화되면 DBA는 코드를 변경하지 않고도 기본 테이블을 구조적으로 변경할 수 있습니다.
CodingWithSpike

11

보기는 데이터베이스 복잡성을 숨 깁니다. 여러 가지 이유로 훌륭하고 많은 상황에서 유용하지만, 자신의 쿼리 및 보고서를 작성할 수있는 사용자가있는 경우 잘못 설계된 제출을 방지하기위한 보호 수단으로 사용할 수 있습니다. 데이터베이스 서버를 다운시키는 불쾌한 데카르트 조인이있는 쿼리.


6

OP는 뷰를 사용하려는 유혹이있는 상황이 있는지 물었지만 적절하지 않습니다.

보기를 사용하지 않으려는 것은 복잡한 조인을 대체하는 것입니다. 즉, 문제를 작은 조각으로 나누는 절차 적 프로그래밍 습관이 하나의 큰 조인 대신 함께 결합 된 여러 뷰를 사용하도록 유도하지 마십시오. 이렇게하면 기본적으로 하나의 큰 쿼리가 아닌 여러 개의 개별 쿼리를 수행하므로 데이터베이스 엔진의 효율성이 떨어집니다.

예를 들어 테이블 A, B, C 및 D를 함께 조인해야한다고 가정 해 보겠습니다. 테이블 A와 B에서 뷰를 만들고 C와 D에서 뷰를 만든 다음 두 뷰를 결합하고 싶을 수 있습니다. A, B, C, D를 하나의 쿼리로 조인하는 것이 훨씬 좋습니다.


나는 그것이 옳다고 생각하지 않는다. 적어도 그것은 DBMS 이론이 진행되는 방식이 아니다 (다양한 구현은 이론을 존중하지 않기로 결정할 수있다). 쿼리 파서는 본질적으로 보이는 모든 뷰를 해당 SQL로 대체하고 옵티마이 저는 거기에서 이동합니다. 두 경우는 동일해야합니다.
SquareCog

뷰에 인덱스를 추가 할 수있는 경우에도 마찬가지입니다.
therealhoff

저는 PostgreSQL에 가장 익숙하고 이전 버전은 쿼리를 결합하는 데별로 좋지 않았습니다. 그러나 새로운 것이 훨씬 낫습니다. 내 대답은 적어도이 특정 DBMS에는 더 이상 적용되지 않습니다.
Barry Brown

5

뷰는 데이터를 중앙 집중화하거나 통합 할 수 있습니다. 제가있는 곳에는 서로 다른 두 개의 연결된 서버에 여러 데이터베이스가 있습니다. 각 데이터베이스는 다른 응용 프로그램에 대한 데이터를 보유합니다. 이러한 데이터베이스 중 몇 개는 여러 다른 애플리케이션과 관련된 정보를 보유합니다. 이러한 상황에서 우리가 할 일은 데이터가 실제로 저장된 데이터베이스에서 데이터를 가져 오는 뷰를 해당 애플리케이션의 데이터베이스에 만들어서 작성하는 쿼리가 서로 다른 데이터베이스를 통과하는 것처럼 보이지 않도록하는 것입니다.


4

지금까지의 응답은 정확합니다. 뷰는 보안, 비정규 화 (잘못하면 그 길에 많은 고통이 있지만), 데이터 모델 추상화 등을 제공하는 데 좋습니다.

또한 뷰는 일반적으로 비즈니스 로직을 구현하는 데 사용됩니다 (과거 한 사용자는 지난 40 일 동안 로그인하지 않은 사용자입니다).


7 개의 참조 테이블을 브리 닝하여 비정규 화 한 다음 해당 참조 테이블 중 하나만 필요한 항목을 쿼리하는 경우 그것은 많은 낭비입니다. 이러한 뷰에 참여하기 시작하면 상황이 악화됩니다.
SquareCog

이거 확실하니? MSDN은 'SQL Server가 이름으로 뷰를 참조하는 쿼리를 처리 할 때 뷰의 정의는 일반적으로 기본 테이블 만 참조 할 때까지 확장됩니다. 이 프로세스를 뷰 확장이라고합니다. 그것은 매크로 확장의 한 형태입니다. ' 확장 프로세스 동안 엔진이 쿼리에 필요한 기본 테이블 (뷰의) 만 포함 할 수있을만큼 똑똑 할 것이라고 생각합니다.
Anthony

Anthony, "select foo_col from (select foo. *, bar. * from foo join bar on (foo.id = bar.id))"와 같은 쿼리를 상상해보십시오.이 쿼리에서 내부 선택은 뷰입니다. 바 조인이 안전하게 삭제 될 수 있음을 분명히합니다 (실제로 관계가 엄격하게 1-1이 아니라면 불가능합니다). 이것은 더 복잡한 쿼리에서 더욱 까다로워지며 모든 작업을 수행하기 위해 일반 RDBMS에 의존하는 것을 권장하지 않습니다. 인간 캔 정리. SQL Server가 가능할 수도 있습니다. MySQL이 그렇게했다면 충격을받을 것입니다. Oracle? Postgres? 항상 그렇듯이 의심 스러울 때 쿼리 계획을 읽어보십시오.
SquareCog

3

뷰는 SQL 스크립트에서 반복되는 복잡한 JOIN 문을 많이 저장합니다. 일부 뷰에서 복잡한 JOIN을 캡슐화하고 필요할 때마다 SELECT 문에서 호출 할 수 있습니다. 이것은 때때로 모든 쿼리에서 조인 문을 작성하는 것보다 편리하고 간단하며 더 쉽습니다.


2

뷰는 단순히 저장되고 명명 된 SELECT 문입니다. 라이브러리 함수와 같은 뷰를 생각하십시오.


저장 프로 시저가 이에 더 적합하지 않을까요? 때로는 삭제 및 업데이트 뷰가있는 함수가 필요합니다. 뷰는 대상 사용자를 제한하는 추상화 또는 방법으로 간주되어야합니다.
HumbleWebDev

1

보고를 위해보기 사용을 강조하고 싶었습니다. 특히 데이터 편집 및 삽입 (OLTP 사용)을위한 성능 속도를 높이기 위해 데이터베이스 테이블을 정규화하는 것과보고 및 분석 (OLAP 사용)을위한 쿼리를위한 테이블 조인 수를 줄이기 위해 비정규 화하는 것 사이에 충돌이 있습니다. 데이터 입력은 최적의 성능을 가져야하기 때문에 필요에 따라 OLTP가 일반적으로 이깁니다. 최적의보고 성능을 위해보기를 작성하면 두 클래스의 사용자 (데이터 입력 및 보고서 뷰어)를 모두 만족시키는 데 도움이 될 수 있습니다.


1

여러 UNION이 포함 된 매우 긴 SELECT를 기억합니다. 각 UNION에는 상당히 길고 이해하기 어려운 SELECT에 의해 즉석에서 생성 된 가격 테이블에 대한 조인이 포함되어 있습니다. 가격표를 만드는 관점이 있으면 좋았을 것 같습니다. 전체 SELECT를 약 절반으로 줄였습니다.

DB가 뷰를 한 번 평가할지 아니면 매번 호출 될지 모르겠습니다. 아는 사람 있어요? 전자의 경우 뷰를 사용하면 성능이 향상됩니다.


Oracle CBO는 뷰를 한 번 평가 (구체화, 호출)하거나 뷰에 대한 SQL을 나머지 select 문에 병합하고 실행할 수 있습니다. 더 낮은 예상 비용을 기준으로 결정합니다.
WW.

select 문이 쿼리 전체에서 일정하고 단순히 여러 번 반복되는 경우 CTE (공통 테이블 식)로 문제를 해결할 수 있습니다. 이것은 SQL Server 2000에서 사용할 수 없었기 때문에 SQL Server 2005/2008에만 적용됩니다. 예,보기는 여전히 반복적으로 호출되었을 것입니다.
등록 된 사용자

@Registered User : CTE는 SQL Server 전문 분야가 아닙니다. DB2에서 시작되었으며 PostgreSQL에도 존재합니다 (유용하고 ISO SQL 표준이기 때문에). 뷰가 인라인되거나 블랙 박스로 취급되는지 여부는 구현에 따라 다르지만 일부 RDBMS는 다른 것보다 더 똑똑합니다.
단지 누군가

@just somebody : 다른 RBDMS에서 CTE에 대한 경험이 없기 때문에 내 의견은 SQL Server 2005/2008로 제한되었습니다. 또한이 주석은 2005 년 이전에는 SQL Server에서 CTE를 사용할 수 없었기 때문에 SQL Server 2000에는 적용되지 않는다는 것을 나타내도록 규정되었습니다.
등록 된 사용자

뷰에 대한 또 다른 대안은 가격 테이블을 미리 임시 테이블에 넣는 것입니다.
SeaDrive 2010

0

[my_interface]! = [user_interface]가 필요할 때마다.

예:

표 A :

  • 신분증
  • 정보

표 A보기 :

  • 고객 정보

이것은 고객에게 ID를 숨기고 정보를 한 번에 더 자세한 이름으로 바꿀 수있는 방법입니다.

뷰는 기본 키 ID에 기본 인덱스를 사용하므로 성능 손실이 발생하지 않고 선택 쿼리를 더 잘 추상화합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.