복붙노트

[SQL] 일반 영어 정규화

SQL

일반 영어 정규화

나는 데이터베이스 정규화의 개념을 이해하지만 항상 힘든 시간 일반 영어로 설명이 - 특히 면접. 나는 위키 피 디아 게시물을 읽을 가지고 있지만, 여전히 하드 비 개발자들에게 개념을 설명하기 위해 찾을 수 있습니다. "중복 된 데이터를 얻을하지 않는 방법으로 데이터베이스를 디자인하는 것은"마음에 오는 최초의 일이다.

합니까 누구는 일반 영어로 데이터베이스 정규화의 개념을 설명 할 수있는 좋은 방법이있다? 그리고, 첫 번째, 두 번째 및 세 번째 정상 형태의 차이를 보여주는 몇 가지 좋은 예는 무엇인가?

당신이 면접에 가서 사람이 묻는 말 : 정상화의 개념을 설명하고 어떻게 정규화 된 데이터베이스를 설계에 대해 갈 것입니다.

어떤 주요 포인트 면접을 찾고있다?

해결법

  1. ==============================

    1.나는 내 아내에게 설명해야한다면 글쎄, 그런 된 뭔가를 할 것이다 :

    나는 내 아내에게 설명해야한다면 글쎄, 그런 된 뭔가를 할 것이다 :

    주요 아이디어는 대용량 데이터의 중복을 방지하는 것입니다.

    의 사람들의 목록과 온 나라를 살펴 보도록하자. 대신 모든 사람을위한 "보스니아 & 헤르체고비나"만큼 될 수있는 국가의 이름을 잡고, 우리는 단순히 숫자를 개최 참조 그 나라의 테이블. 그래서 그 대신 100 '보스니아 헤르체고비나 "의를 개최, 우리는 100 # 45을 누르고 있습니다. 이제 미래에 자주 발칸 국가들과 어떻게 그들이 두 나라로 분리 : 보스니아 헤르체고비나, 나는 단지 한 곳에서 변경해야합니다. 물론,의 종류.

    이제, 2NF을 설명하기 위해, 나는 예를 변경 한 것이며,하자 우리는 모든 사람이 방문 국가 목록을 유지한다고 가정합니다. 대신 같은 테이블을 채의 :

    Person   CountryVisited   AnotherInformation   D.O.B.
    Faruz    USA              Blah Blah            1/1/2000
    Faruz    Canada           Blah Blah            1/1/2000
    

    나는 그들 모두를 연결하는 세 개의 테이블, 국가 목록에 하나 개의 테이블, 사람의 목록과 다른 테이블에 하나 개의 테이블을 만든 것입니다. 그게 내게는 사람의 정보 나 국가 정보를 변경 얻을 수있는 가장 자유를 제공합니다. 이 정규화 예상하는대로 "중복 행을 제거"나를 수 있습니다.

  2. ==============================

    2.일대 다 관계는 외래 키에 의해 연결된 두 개의 별도의 테이블로 표현되어야한다. 당신은 당신이 위험 문제에 대한 어떤 단서 정상화를 위반하고, 하나의 테이블에 논리적 일대 다 관계를 밀어하려고합니다.

    일대 다 관계는 외래 키에 의해 연결된 두 개의 별도의 테이블로 표현되어야한다. 당신은 당신이 위험 문제에 대한 어떤 단서 정상화를 위반하고, 하나의 테이블에 논리적 일대 다 관계를 밀어하려고합니다.

    당신이 당신의 친구들과 그들의 고양이의 데이터베이스를 말해봐. 사람이 하나 이상의 고양이를 가질 수 있기 때문에, 우리는 사람과 고양이 사이에 일대 다 관계를 가지고있다. 이 두 테이블을 요구한다 :

    Friends
    Id | Name | Address
    -------------------------
    1  | John | The Road 1
    2  | Bob  | The Belltower
    
    
    Cats
    Id | Name   | OwnerId 
    ---------------------
    1  | Kitty  | 1
    2  | Edgar  | 2
    3  | Howard | 2
    

    (Cats.OwnerId는 Friends.Id에 외래 키)

    위의 디자인은 완전히 모든 알려진 정상화 수준으로 정상화와 부합 함을 선언한다.

    하지만이 같은 하나의 테이블에서 위의 정보를 표현하기 위해 노력했다 말 :

    Friends and cats
    Id | Name | Address       | CatName
    -----------------------------------
    1  | John | The Road 1    | Kitty     
    2  | Bob  | The Belltower | Edgar  
    3  | Bob  | The Belltower | Howard 
    

    (이것은 내가 엑셀 ​​시트가 아니라 관계형 데이터베이스에 사용 된 경우 내가 만든 수있는 디자인의 종류이다.) 나는 데이터가 일치 할 경우 단일 테이블 접근 힘 내게 몇 가지 정보를 반복합니다. 이 디자인을 가진 문제는 중복, 그리고 논리 불일치를 소개하는 것이 쿼리 및 변경 데이터에 어렵고 (최악)을 가능하게 밥의 주소는 "종루는"두 번 반복되어 있다는 정보와 같은 몇 가지 사실.

    예. 밥이 이동 있는지 확실 내가 두 행에 주소를 변경해야한다. 밥이 또 다른 고양이를 얻는 경우에, 나는 정확히 같은 다른 두 행에 입력 한 이름과 주소를 반복해야합니다. 예를 들면 내가 행 중 하나에 밥의 주소를 잘못 입력 할 경우, 갑자기 데이터베이스는 밥이 사는 위치에 대한 일치하지 않는 정보가 있습니다. 유엔 - 정규화 된 데이터베이스는 일관성과 자기 모순 데이터의 도입을 막을 수 없습니다, 따라서 데이터베이스는 신뢰할 수 없습니다. 이 명확하게 허용되지 않습니다.

    정규화는 잘못된 데이터를 입력하는 것을 방지 할 수 없습니다. 무엇 정규화 방지하는 것은 일치하지 않는 데이터의 가능성이다.

    정상화 비즈니스 의사 결정에 의존하는 것이 중요하다. 당신이 고객 데이터베이스를 가지고 있고, 당신은 단지 고객 당 하나의 주소를 기록하기로 결정하는 경우, 다음 테이블 디자인 (#CustomerID, CUSTOMERNAME, CustomerAddress는) 괜찮습니다. 당신은 당신이 각 고객이 하나 개 이상의 주소를 등록 할 수 있도록 결정할 그러나 경우에 당신은 지금 고객과 주소 간의 일대 다 관계를 가지고 있기 때문에, 다음 같은 테이블 디자인은 표준화되지 않습니다. 따라서 당신은이 정규화 된 경우, 데이터베이스 뒤에있는 비즈니스 모델을 이해해야 결정하기 위해 데이터베이스를 볼 수 없습니다.

  3. ==============================

    3.이것은 내가 인터뷰를 요청할 것입니다 :

    이것은 내가 인터뷰를 요청할 것입니다 :

    왜 우리는 대신 여러 테이블을 사용하는 응용 프로그램에 대한 단일 테이블을 사용하지 않는?

    대답은 정상화 당연히이다. 이미 말했듯이, 그 중복 거기가 업데이트 이상에 의해을 방지 할 수 있습니다.

  4. ==============================

    4.이것은 철저한 설명이 아니라 정상화의 하나 개의 목표는 어색함없이 성장을 허용하는 것입니다.

    이것은 철저한 설명이 아니라 정상화의 하나 개의 목표는 어색함없이 성장을 허용하는 것입니다.

    당신은 사용자 테이블을 가지고, 모든 사용자가 오직 하나 개의 전화 번호를해야 할 것입니다 예를 들어, 그것의 벌금이 테이블에서 PHONENUMBER 열을가합니다.

    각 사용자가 전화 번호의 변수 번호를 가지고 갈 경우 그러나, 등 phonenumber1, phonenumber2,이 두 가지 이유입니다 같은 열이 어색 할 것입니다 :

    대신, 각 행은 전화 번호와이 속한 사용자 테이블에있는 행에 외래 키 참조를 포함하는 PHONENUMBER 테이블을 가지고 싶어. 없음 빈 열이 필요하지 않습니다, 각 사용자는 필요에 따라 몇 가지 또는 여러 개의 전화 번호로 할 수 있습니다.

  5. ==============================

    5.정상화에 대한주의 한쪽 포인트 : 완전 정상화 데이터베이스는 공간 효율적이지만 반드시 사용 패턴에 따라 데이터의 대부분의 시간을 효율적으로 배치되지 않습니다.

    정상화에 대한주의 한쪽 포인트 : 완전 정상화 데이터베이스는 공간 효율적이지만 반드시 사용 패턴에 따라 데이터의 대부분의 시간을 효율적으로 배치되지 않습니다.

    자신의 비정규 위치에서 정보의 모든 조각을 찾기 위해 여러 테이블 주위에 건너 뛰는 시간이 걸립니다. 시간이 저장 공간보다 더 가치입니다 고부하 상황에서 (초당 수백만 개의 행이 말 신용 카드 거래 처리와 같은 동시 클라이언트의 수천, 주위를 비행), 적절하게 비정규 테이블이 완전히 정상화 테이블보다 더 나은 응답 시간을 제공 할 수 있습니다.

    이에 대한 자세한 정보를 원하시면, 켄 헨더슨에 의해 작성된 SQL 책을 찾습니다.

  6. ==============================

    6.나는 정상화 말하자면 효율적으로 일을 할 수있는 노트를 유지처럼 말할 것입니다 :

    나는 정상화 말하자면 효율적으로 일을 할 수있는 노트를 유지처럼 말할 것입니다 :

    설계 및 구현 일부를 들어, "전문 용어"로 다시 이동하고 멀리 평신도 용어에서 그것을 유지,하지만 난 당신이 간단하게 할 수 있다고 가정 할 수 있습니다 이잖아. 당신은 당신이 처음에 필요하고, 정상화가에 올 때 다음, 당신은 당신이 다음을 확인합니다 말을 말할 것입니다 :

    난 당신이뿐만 아니라 비정규 말하는 경우가 더 인상적 일 수있다 생각하고, 당신은 항상 가장 좋은 구조를 가지고 정상적인 형태가 될 수 없다는 사실.

  7. ==============================

    7.정규화는 관계를 통해 연결되어 있음을 테이블을 설계하는 데 사용하는 규칙의 집합입니다.

    정규화는 관계를 통해 연결되어 있음을 테이블을 설계하는 데 사용하는 규칙의 집합입니다.

    이 쿼리의 속도를 증가, 필요한 저장 공간을 줄이고 새로운 데이터를 수용 할 수있는 테이블을 기존의 구조 조정에 대한 필요성을 방지, 반복적 인 항목을 방지하는 데 도움이됩니다.

    첫 번째 정규형 : 데이터는 가장 작은 단위로 헤어 졌해야합니다. 테이블 컬럼의 반복 그룹을 포함 할 수 없습니다. 각 행은 하나 이상의 기본 키 식별됩니다. 예를 들어, '사용자 정의'테이블의 '이름'라는 이름의 열이있다, 그것은 '이름'과 '성'으로 나눌 수 있습니다. 또한, '사용자 정의'특정 사용자를 식별하기 위해 'CustiomID'라는 이름의 열이 있어야합니다.

    제 2 정규형은 각 키가 아닌 열이 직접 전체 기본 키와 관련 될 것이다. 는 '사용자 정의'테이블 '도시'라는 이름의 열이있는 경우, 예를 들어, 도시 기본 키 및 도시 이름을 가진 별도의 테이블은 'CityID'와 '도시'열을 교체하십시오 '사용자 정의'테이블에 정의되고있다한다 'CityID'이야기의 외래 키를 확인합니다.

    3 정규형 : 키가 아닌 각 컬럼은 다른 키가 아닌 컬럼에 의존해서는 안된다. '전체'열을 제거해야하므로, 예를 들면, 순번 표에서, 칼럼 '합계', '단가'및 '양'에 의존한다.

  8. ==============================

    8.내 액세스 과정의 정상화를 가르치고있는 몇 가지 방법을 내려 휴식.

    내 액세스 과정의 정상화를 가르치고있는 몇 가지 방법을 내려 휴식.

    스토리 보드에 전구체를 논의하거나 데이터베이스를 계획 한 후, 그때 정상화 탐구. 이 같은 규칙을 설명합니다 :

    나는 보드에 이름 필드를 작성하고 다음 빌 Lumbergh처럼의 이름과 성을 놓습니다. 우리는 우리가 이름과 성이 하나 개의 필드에 모두있는 경우, 문제가 무슨 학생들를 조회하도록 요청합니다. 나는 짐 리차드입니다 예를 들어, 나의 이름을 사용합니다. 학생들이 길을 날 실망 연결되지 않는 경우, 나는 그들의 손을 홱 잡아 나와 함께 데리고. :) 나는 어떤 사람들은이 이름을 처음이라고 생각하고 어떤 사람들은 리처드 나를 부르는 것을 가지고 있기 때문에 나는 내 이름은 몇 가지 힘든 이름임을 그들에게 말해. 당신이 내 마지막 이름을 검색하려고 한 경우 내 마지막 이름이 필드의 끝에 묻혀 있기 때문에 (와일드 카드 제외) 정상적인 사람을 위해 어렵게 될 것입니다. 또한 다시는 내 마지막 이름이 마지막에 묻혀 있기 때문에 그들은 쉽게 성을 기준으로 필드 정렬에 문제가있을 것이라는 점을 그들에게 말해.

    나는 그 때 그 의미가 아니라 데이터베이스를 사용하는 것입니다 관객에 기초 것을 알 수 있습니다. 우리가 사람의 주소를 저장하고 있지만, UPS 나 페덱스와 같은 회사를 발송하는 것은 쉽게 그들이 때 갈 필요가 어디에서 아파트 또는 제품군을 끌어에게 분리해야 할 경우 우리는 우리의 일에서 아파트 또는 스위트 번호에 대한 별도의 필드를 필요로하지 않습니다 그들은 도로에 있고 배달 배달에서 실행. 그래서 우리에게 의미가 없다, 그러나 그것은 그들에게 분명히 의미가있다.

    그들은 공백을 피해야하는 이유는 그들에게 설명하기 위해 비유를 사용합니다. 나는 Excel에서하는 것처럼 액세스 및 대부분의 데이터베이스 공백을 저장하지 않는 것이 그들에게 말해. 당신은 아무것도 셀에서 입력하지 않고 파일 크기를 증가하지 않을 경우 엑셀 상관하지 않지만, 액세스는 실제로 필드를 사용하는 것을 그 시점까지 해당 공간을 예약합니다. 그것은 비어 그래서하더라도, 그것은 여전히 ​​공간을 사용하고 그것은 또한뿐만 아니라 아래로 자신의 검색 속도가 느려 그들에게 설명합니다. 비유의 I의 사용은 옷장에 빈 신발 상자입니다. 당신은 옷장에 신발 상자가 있고 신발 한 켤레를 찾고 있다면, 당신은 열고 신발 한 켤레를 위해 각 상자에보고해야합니다. 빈 신발 상자가있는 경우에, 당신은 그냥 옷장에 공간을 낭비하고 있고 신발의 특정 쌍 그들을 통해보고해야하는 경우도 시간을 낭비.

    나는 소시지 손가락을 가지고 있고 나는 또 다시 같은 일을 입력해야하는 경우 값을 잘못 입력하기 때문에 나는 그들에게 고객 정보에 대한 반복 값을 많이 가지고 있으며, 우리는 중복을 피하려는 그들에게 표를 보여줍니다. 이러한 데이터의 "지방 손가락은"내 쿼리가 올바른 데이터를 찾을 수 없습니다 이어질 것입니다. 우리는 대신 별도의 테이블에 데이터를 중단하고 기본 및 외래 키 필드를 사용하여 관계를 만들 것입니다. 우리가 대신 우리는 고객의 등 이름, 주소, 여러 번 입력하지 않기 때문에 공간을 절약하는이 방법은 고객에 대한 필드에 고객의 ID 번호를 사용하고 있습니다. 우리는 다음 드롭 다운 목록 / 콤보 박스 / 조회 목록을 논의 할 것이다 또는 Microsoft 나중에 그 이름을 원하는 어떤 다른. :) 당신은 사용자로보고 고객의 수를 해당 고객 필드의 각 시간을 입력 할 수 없습니다, 우리는 설정 당신이 자신의 이름을 선택 할 수 있습니다 고객의 목록을 제공하는 드롭 다운 목록을 있도록 당신을 위해 고객의 ID를 입력합니다. 한 고객이 여러 주문을해야합니다 반면이, 1 대 다수의 관계 일 것이다.

    다 대다 관계에 대해 이야기 할 때 나는 이것을 보여줍니다. 첫째, 프로젝트 정보를 개최한다 직원 정보 1를 개최한다 2 표 1을 그립니다. 표는 다음과 유사한 배치됩니다.

    (Table1)
    tblEmployees
    * EmployeeID
    First
    Last
    (Other Fields)….
    Project1
    Project2
    Project3
    Etc.
    **********************************
    (Table2)
    tblProjects
    * ProjectNum
    ProjectName
    StartDate
    EndDate
    …..
    

    나는 이것이 그들이가 작동하는지 직원 및 프로젝트의 모든 관계를 수립하는 좋은 방법이 될하지 않을 것이라고 그들에게 설명한다. 우리는 새로운 직원이있는 경우 우리가 가진 것, 그래서 첫째, 그들은, 우리는 직원이 오랜 시간이 여기에 있었는지 둘째가 300 개 프로젝트에 참여했을 수도, 그 모든 필드를 낭비 할 수 있도록, 어떤 프로젝트가 없습니다 300 개 프로젝트 필드를 포함합니다. 새로운만을 가지고 그 사람들은 한 프로젝트는 299 개 낭비 프로젝트 필드를해야합니다. 나는 특정 프로젝트에서 일한 모든 사람을 찾기 위해 프로젝트의 각 필드에서 검색해야하기 때문에 그 프로젝트 번호는 프로젝트 필드 중 하나에있을 수 있기 때문에이 디자인은 또한, 결함이있다.

    나는 기본 개념의 공정한 금액을 포함했다. 당신이 일반 영어를 분해 / clarfication과 다른 질문이나 도움이 필요이 있으면 알려주세요. 위키 페이지는 쉬운 영어로 읽어 보지 않았 일부에 대한 발굴 될 수 있습니다.

  9. ==============================

    9.나는 정상화 여러 번에 위키 링크를 읽은 있지만이 문서에서 정상화의 더 나은 개요를 발견했다. 그것은 네 번째 정규형까지 정상화의 설명을 이해하기 쉽게 간단하다. 그것을 읽기를 줘!

    나는 정상화 여러 번에 위키 링크를 읽은 있지만이 문서에서 정상화의 더 나은 개요를 발견했다. 그것은 네 번째 정규형까지 정상화의 설명을 이해하기 쉽게 간단하다. 그것을 읽기를 줘!

    시사:

    정규화는 무엇입니까?

    http://databases.about.com/od/specificproducts/a/normalization.htm

  10. ==============================

    10.데이터베이스 정규화는 중복 데이터를 제거하기 위해 데이터베이스를 설계하는 형식적인 과정이다. 디자인 구성

    데이터베이스 정규화는 중복 데이터를 제거하기 위해 데이터베이스를 설계하는 형식적인 과정이다. 디자인 구성

    데이터 - 사전이나 디자인을 확인하기 위해 다른 메타 데이터 표현을 사용합니다.

    참조

  11. ==============================

    11.아내 이야기의 비유에 대한 +1. 나는 기술 마음없이 사람에게 이야기 찾을 것은 대화의이 유형에 약간의 용이성을 필요로한다.

    아내 이야기의 비유에 대한 +1. 나는 기술 마음없이 사람에게 이야기 찾을 것은 대화의이 유형에 약간의 용이성을 필요로한다.

    그러나...

    이 대화에 추가하려면, (때 인터뷰에서 중요 할 수있다) 동전의 다른면이있다.

    때 정상화, 당신은 데이터베이스 인덱싱과 쿼리를 어떻게 작성하는 방법을 볼 수 있습니다.

    진정한 정상화 데이터베이스에, 나는 상황에 때문에 나쁜의 느린 쓰기 쿼리에 쉽게되었습니다 것을 발견 한 경우 테이블 자체에 작업 테이블에 나쁜 인덱싱, 일반 나쁜 디자인을 가입 할 수 있습니다.

    퉁명스럽게, 높은 수준의 정규화 테이블에 나쁜 쿼리를 작성하는 것이 더 쉽습니다.

    나는 모든 응용 프로그램에 대한 중간 있다고 생각합니다. 어떤 시점에서 당신은 하나 개의 데이터 세트를 얻기 위해 테이블의 톤에 가입 할 필요없이, 몇 테이블에서 모든 것을지고의 용이성을합니다.

  12. from https://stackoverflow.com/questions/2331838/normalization-in-plain-english by cc-by-sa and MIT license