2013-06-27 3 views
1

저는 CREATE VIEW의 유용성을 아주 좋아했습니다. 예를 들어 COALESCE(post.publish, profile.publish)을 통해 전역 및 특정 값을 가질 수 있으므로 publishNULL 인 경우 전역 값이 대신 가져옵니다.보기에서 선택 *을 사용하는 것이 안전합니까?

성능과 논리적 관점에서 약간 궁금한 부분은 기존 테이블과 함께 사용해야합니다.

CREATE VIEW post_info AS 
SELECT post.*, COALESCE(post.publish, profile.publish) AS publish 
FROM post 
INNER JOIN profile 
ON post.profile_id = profile.id 

post_infoSELECT의 경우, 또는 사용 :

CREATE VIEW post_info AS 
SELECT post.id, COALESCE(post.publish, profile.publish) AS publish 
FROM post 
INNER JOIN profile 
ON post.profile_id = profile.id 

그리고 JOINpost_info

CREATE TABLE post (
    id INT, 
    profile_id INT, 
    name VARCHAR, 
    publish ENUM('TRUE', 'FALSE') NULL 
) 

CREATE VIEW 같이 실행하는 데 가장 좋은 것입니다 : 나는 테이블이 있다고 가정하자 postSELECT 추가 값이 필요한 경우?

이 문제에 대한 귀하의 통찰력과 생각을 공유하십시오. 각 솔루션의 장점과 단점에 대한 의견을 듣고 싶습니다. 내가 언급하지 않은 사람이 될 수도 있습니다.

+0

'SELECT *'는 결코 좋지 않습니다. – GolezTrol

+1

나는 보통'*'을 피하고 싶다. 그러나 나는 더 많은 컬럼을 가지고 테이블을 완성 할 특별한 경우라고 생각한다. –

+0

'ENUM ('TRUE', 'FALSE') NULL '을 (를) 게시 하시겠습니까?! Eeek! 왜 'BOOLEAN NULL을 게시하지 않습니까?' – RandomSeed

답변

0

정말 어떻게 전망을 사용 하느냐에 달려 있습니다. MySQL이 뷰를 참조하는 쿼리를 처리 할 수있는 두 가지 메소드가 있으며, 사용 된 메소드는 뷰 선언의 ALGORITHM 절에 의존한다는 것을 언급 할 가치가있다.

더 나은 말씨의 부족을

, 나는 the manual를 재현하는 것입니다 :

[ALGORITHM =] MERGE를 들어,보기와 뷰 정의에 참조하는 문의 텍스트는 합병 것을하는 뷰 정의의 일부 은 해당 부분을 대체합니다.

TEMPTABLE의 경우보기의 결과가 임시 테이블로 검색되고이 테이블이 명령문을 실행하는 데 사용됩니다.

UNDEFINED의 경우 MySQL은 사용할 알고리즘을 선택합니다.

MERGE 알고리즘은 일반적으로하지만 MySQL은 (자세한 내용은 링크 된 매뉴얼 페이지를 참조)를 사용 할 수없는 많은 경우가있다, 마지막 쿼리의 빠른 처리를 할 수 있습니다.

그래서 대답입니다 :보기는 포장 쿼리 SELECT *으로 MERGE 알고리즘 버전의 사용을 금지하지 않는 경우 ALGORITHM = TEMPTABLE 으로 정의하고, 추가 JOIN하지 않고, 더 나은되지 않습니다.

그렇지 않으면 MERGE을 사용하지 않으면 두 번째 해법이 더 좋을 수 있습니다. 보조 노트로

는, 당신이 언급 유스 케이스를 ADRESS하기 위해, 더 나은 옵션은 응용 프로그램 계층은 삽입시 profile.publish의 값으로 post.publish에 꽉 차게하고 뷰뿐만 아니라 JOIN 없애 것 . 또는 테이블에 적합한 방아쇠를 놓아도 동일한 효과를 얻을 수 있습니다.

+0

게시물을 만든 후에도 전역 값이 영향을 주길 원한다면, 값을 채우는 것이 나에게 이상적이지는 않습니다. 나는'내가 생각하는 그 알고리즘에 대해 현명하게 성장할 필요가있다. –

+0

"isDefaultValue BOOLEAN'과 같은 열을 추가하면 더 나은 결과를 얻을 수 있습니다. 그러면 'UPDATE post set publish = whatever_id WHERE isDefaultValue' 할 수 있습니다. 그러면 업데이트가 조금 더 길어 지지만 검색이 훨씬 빨라집니다. 게다가,이 값은 데이터베이스 (database)가 걱정해야 할 것이 아니라 어플리케이션 계층 (비즈니스 규칙)의 관심사이다. – RandomSeed

관련 문제