복붙노트

[SQL] 널 (NULL) 열 또는 별도의 테이블을 통해 키 / 값 테이블을 사용하는 [단점은 무엇입니까?

SQL

널 (NULL) 열 또는 별도의 테이블을 통해 키 / 값 테이블을 사용하는 [단점은 무엇입니까?

나는 얼마 전에 만든 지급 관리 시스템을 업그레이드하고 있습니다. 그것은 현재는 받아 들일 수 각 지불 유형에 대한 하나의 테이블이 있습니다. 그것은이 업그레이드를 완화하는 한 가지를 지불 할 수있는 제한됩니다. 나는 그것을 설계하는 방법에 관한 제안을 물어 봤는데, 난에서 작업에 이러한 기본적인 아이디어를 가지고 :

이에 대한 나의 목표는 다음과 같습니다하지 터무니없이 느린, 자기 문서화 가능한 한, 다른 목표를 유지하면서 유연성을 극대화.

난 아주 많이 있기 때문에 각 테이블에서 중복 된 컬럼의 일처럼하지 않습니다. 그것은 반대로 모든 지불 유형 ... ORM에 대한 기능을 제공하는 기본 클래스를 상속 지급 형 클래스를 반영?

그냥 현재의 디자인으로 "형 안전"자기 문서화로 때문에 나는이 가장쪽으로 기울고 있어요. 그러나, 1과 마찬가지로, 나는 새 테이블을 추가 할 필요가, 새로운 지불 유형을 추가 할 수 있습니다.

난 안 때문에 "낭비되는 공간"의 3처럼 수행하고 즉시 지불 유형에 사용되는 열을 분명하지 않다. 문서는 약간이의 고통을 완화 할 수 있지만, 내 회사의 내부 도구는 기술 문서 찾기 / 저장하기위한 효과적인 방법이 없습니다.

내가 4 주어진 인수는 새 결제 방법을 추가 할 때 데이터베이스를 변경할 필요가 완화 것이었지만, 3 명확성의 부족보다 더 나쁜 겪고있다. 현재 데이터베이스를 변경하는 것은 문제가되지 않습니다,하지만 우리는 고객이 길을 자신의 데이터베이스를 유지시키는 시작하기로 결정한다면 그것은 물류 악몽이 될 수 있습니다.

그래서, 물론 나는 나의 편견을 가지고있다. 사람이 어떤 좋은 아이디어가 있습니까? 어떤 디자인 당신은 맞는 최고의 생각하십니까? 어떤 기준에 나는 내 결정을 기반으로해야합니까?

해결법

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

    1.아마 당신은이 질문을 보일 것입니다

    아마 당신은이 질문을 보일 것입니다

    빌 Karwin에서 허용 대답은 키 / 값 테이블은 일반적으로 알고에 대해 특정 인수에 들어가는 등 법인 속성 값 (EAV)

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

    2.노트 이 주제는 논의되고 있으며,이 스레드 그러므로 나는 그것이 합리적인 치료, 나와 함께 곰하시기 바랍니다 준, 다른 스레드에서 참조되고있다. 내 의도는 판단에 참고가되는 정보 제공보다는 라벨에 단지를 기반으로 단순한 사람을 할 수 있도록하는 것이, 이해를 제공하는 것입니다. 당신이 강렬한 찾아내는 경우에, 당신의 여가에서 청크에서 읽을; 당신이 배고픈 때 다시 와서, 그리고 전.

    노트 이 주제는 논의되고 있으며,이 스레드 그러므로 나는 그것이 합리적인 치료, 나와 함께 곰하시기 바랍니다 준, 다른 스레드에서 참조되고있다. 내 의도는 판단에 참고가되는 정보 제공보다는 라벨에 단지를 기반으로 단순한 사람을 할 수 있도록하는 것이, 이해를 제공하는 것입니다. 당신이 강렬한 찾아내는 경우에, 당신의 여가에서 청크에서 읽을; 당신이 배고픈 때 다시 와서, 그리고 전.

    EAV 3NF의 차이 제대로 심하게 수행이처럼, 제대로, 그리고 심하게 할 사이에 차이가 있습니다. 우리 기술 연구에서, 우리는 작동하고 무엇을하지 않는 정확히 무엇에 대해 정확하게 할 필요가; 잘 수행하고, 무엇을하지 말아야 할 것. 담요 문, misinform 사람들, 따라서을 방해 진행 상황과 관련된 문제의 보편적 이해 위험하다.

    나는 가난한 비 숙련 노동자들의 구현 및 표준 준수의 수준을 잘못 설명 제외하고, 또는 아무것도에 대해 아닙니다. 내가 여기로 오해 볼 경우, 나는 그것을 해결하기 위해 시도합니다.

    정규화는 종종에 단어 때문에 오해한다. 위키와 다른 무료 소스는 실제로 표준이 아닌 호환 제품의 유효성을 검사 않도록 공급 업체의 편견을 가지고 학문적 근거가없는 완전히 무의미한 "정의", 게시 할 수 있습니다. 커드 그의 열두 규칙을 발표 있습니다. 나는 기준으로 그것을 사용 그래서 나는 이상 충분히 대부분의 요구 사항입니다 5NF의 최소를 구현합니다. 전자 (그 정의가 혼동되지 않는 적어도) 판독기에 의해 이해되는 3 정규형 가정 넣어 ...

    2.1 정의

    다섯 번째 정규 양식은 다음과 같이 정의된다 :

    나는 그것이하지 데이터베이스가 특정 NF 여부에 표준화되어있는 구분을; 데이터베이스는 단순히 정상화됩니다. 일부 테이블은 1NF 필요할 수 있습니다 다른 3NF, 아직 다른 사람들이 5NF이 필요합니다 : 그것은 각 테이블은 특정 NF로 표준화되어 있다는 점이다.

    2.2 성능

    사람들이 정상화 성능을 제공하지 않았다는 것을 생각하고는 "성능 denormalise"을했을 때 시간이 있었다. 신화는 정체를 폭로 된 것을 하나님 께 감사하고, 표준화 된 데이터베이스가 더 나은 수행하는 것이 대부분의 IT 전문가 오늘날 실현. 데이터베이스 공급 업체는하지 denormllised 파일 시스템, 표준화 된 데이터베이스를 위해 최적화 할 수 있습니다. 진실은, 데이터베이스가 처음에 정규화되지 않았다있다 "denormalised"(그것은 심하게 수행),이 unnormalised했다, 그들은 약간 더 성능을 개선하기 위해 스크램블링했다. Denormalised 될하기 위해, 충실 첫번째 정규화해야하고, 그 일어났다하지 않습니다. 나는 충실한 정상화하고 아무것도를 제공하는 등 "성능 denormalised"데이터베이스의 점수를 다시 한 그들은 백만큼, 배 빠른 속도로 적어도 10에서 실행합니다. 또한, 그들은 디스크 공간의 일부만이 필요합니다. 내가 서면으로 운동을 보장한다는 보행자 있도록합니다.

    2.3 제한

    한계, 또는 오히려 5NF의 전체 범위는 다음과 같습니다

    3.1 정의

    여섯 번째 정규 양식은 다음과 같이 정의된다 :

    수행 할 수 있습니다 더 정규화가 없기 때문에 그것은 기약 정규형, 궁극적 인 NF로 알려져 있습니다. 이 중반에 90 년대 학계에서 논의되었지만, 그것은 형식적으로 만 들어 2003 년에 선언 한 사람의 관계, relvars, "관계"등의 혼란에 의해, 관계형 모델의 형식을 폄하 같은 : 모든 넌센스 캔을 공식적으로, 위의 정의를 식별 환원 할 수없는 관계가, 때때로 원자 관계라고하기 때문에 침대에 넣어.

    3.2 진행

    6NF은 (5NF하지 않는 것이)입니다 제공하는 증가 :

    제가 (다른 사람이) 명시 적으로 사용하는 (a)는 간단한 SQL과 매우 높은 성능을 제공 (B)를 전혀 문제없이, 선회, 따라서 허용을 위해 20 년 전 5NF 테이블을 향상 공급하는 있다고 가정 해 봅시다; 산업의 학문적 거인이 공식적으로 우리가 무엇을하고 있는지 정의했다고 알고 좋은했다. 내가 손가락을 떼지 않고 하룻밤, 내 5NF 테이블, 6NF 이름이 변경되었다. 둘째, 우리는 단지 우리가 그것을 필요로하는 곳 않았다; 다시, 테이블,하지 6NF로 정규화 된 데이터베이스이었다.

    3.3 SQL 제한

    그것은 특히 조인 다시, 그것은 매우 복잡 적당히 복잡한 차종을 아무것도, 성가신 언어입니다. (그것은 대부분의 코더가 이해하거나 사용하는 서브 쿼리하지 않는 별도의 문제입니다.) 그것은 5NF에 필요한 구조를 지원하지만 단지. 강력하고 안정적인 구현을 위해, 하나는 추가 카탈로그 테이블의 부분적으로 구성 될 수있는 추가 표준을 구현해야합니다. SQL에 대한 최신 정보 "에 의한 사용은"잘 정말 90 년대 초반에 의해 경과했다; 그것은 6NF 테이블에 대한 어떠한 지원도 전혀없는, 그리고 필사적으로 교체를 필요로한다. 우리는 단지 그것을 다룰 필요가 있도록하지만, 우리가 가진 전부입니다.

    표준 및 추가 카탈로그 테이블을 구현했던 사람들을 위해, 그것은 기능을 제공하기 위해 카탈로그를 확장 할 수있는 진지한 노력은하지 않았다 표준 6NF 구조를 지원하는 데 필요한 : 열이있는 테이블에, 어떤 순서에 속하는; 필수 / 선택; 형식으로 표시; 등 본질적으로 SQL 카탈로그 결혼 전체 메타 데이터 카탈로그.

    6NF가 5NF이 포함되어 있으므로 각각의 NF가, 그 안에 각각의 이전 NF가 들어 있습니다. 우리는 6NF를 제공하기 5NF을 중단하지 않았다, 우리는 5NF에서 진행을 제공; SQL이 미흡 어디 우리는 카탈로그를 제공했다. 이것이 의미하는 바이며, 이러한 외래 키에 대한 같은 기본적인 제약; SQL 선언적 참조 무결성을 통해 제공되었다과 가치 도메인; 데이터 유형; 체크 무늬; 그리고 규칙은 5NF 수준에서 그대로 유지하고, 이러한 제약은 전복되지 않았다. 높은 품질과 표준을 준수 5NF 데이터베이스의 높은 성능은 6NF을 도입하여 어쨌든 감소되지 않았다.

    3.4 카탈로그

    그것은 6NF에 5NF에서 점프를 처리하는 데에서, 사용자 (모든 보고서 도구) 및 개발자를 보호하는 것이 중요하다 (이 괴짜 코딩 응용 프로그램이 될 그들의 일이다, 데이터베이스 괴짜로 내 일이다). 심지어 항상 나를 위해 설계 목표였다 5NF에서 : 제대로 정규화 된 데이터베이스, 최소한의 데이터 디렉토리에, 아주 쉽게 사용할 수 사실이고, 나는 그것을 포기하려고 했어요 방법이 없었습니다. 때문에 일반 유지 보수 및 확장 때문에, 6NF 구조는 시간이 지남에 따라 변경 있음을 명심 데이터베이스의 새 버전은 정기적으로 게시됩니다. 의심의 여지없이, (이미 성가신 5NF에서) SQL이 6NF 테이블에서 5NF 행을 구성하는 데 필요한, 더 복잡합니다. 감사, 그 완전히 불필요합니다.

    우리는 이미 확인 된 우리의 카탈로그를 가지고 있기 때문에 전체 SQL이-아니라-제공합니까 6NF-DDL-것을-, 내가 카탈로그를 읽을 수있는 작은 유틸리티를 썼다는 것입니다 경우 :

    5NF의 복잡성 존재가 제거 때문에 피벗에 대한 유틸리티를 작성하지 않았고, 그들은 5NF 강화-FOR-회전과 마찬가지로, 지금 쓰기에 죽은 간단합니다. 난 단지 클라이언트에 출하하기 전에 서버에서 수행 할 필요가 통계,의옵니다 무거운를 포함하는 기능을 제공해야하므로 게다가, 대부분의 보고서 도구는 피벗 제공합니다.

    3.5 성능

    모든 사람은 자신의 "병"고통, 곰에 대한 자신의 십자가를 가지고; 나는 성과에 집착 할 일이. 내 5NF 데이터베이스는 그래서 내가 생산에 물건을 올려 놓는 전에, 필요에 비해 내가 훨씬 더 벤치 마크를 실행 당신을 확신하게 잘 수행. 6NF 데이터베이스에는 더 정확하게, 더, 더 나은 5NF 데이터베이스와 동일한 수행합니다. '복잡한'6NF SQL이하는 유일한 것은의 5NF SQL하지 않는 것이 훨씬 더 조인과 서브 쿼리 수행하기 때문에 이것은 놀라운 일이 아니다.

    당신은 신화를 검사해야합니다.

    3.6 혜택

    (경우에만 필요에 따라 개선과 함께 항상 5NF 반대로, 나중에 6NF으로 밝혀졌다 전체 카탈로그 등 포함), 그리고 고객은 매우 행복 즉 우리의 최초의 진정한 6NF 데이터베이스이었다. 물론 나는 출산 후 몇 시간 동안 성능을 모니터링하고, 나는 내 옆에 6NF 프로젝트에 대한 더 빠른 원주 액세스 방법을 확인했다. 즉, 내가 할 때 DW 시장 경쟁의 약간이 야기 될 수 있습니다. 고객은 준비되지 않은, 우리는 파괴되지 않는 것을 해결되지 않습니다.

    3.7 정확히, 6NF에 대해, "나쁜"는 무엇입니까?

    모두가 표준에 많은 형식, 구조 및 준수로 함께 작업에 접근 할 주. 그것이 될 것입니다 그래서 바보 모든 6NF 데이터베이스가 잘 수행하고 유지 관리가 용이 ​​것을, 우리의 프로젝트에서 결론을 내릴 수 있습니다. 그것은 모든 6NF 데이터베이스가 심하게 수행 유지하기 어려운 것이 (다른 사람의 구현보고에서) 결론 마찬가지로 어리석은 것; 재해. 언제나처럼, 기술적 인 노력과 함께, 그 결과 성능 및 유지 · 보수의 용이성은 관련 기술 세트에 추가하여, 표준 형식, 구조 및 준수에 엄격하게 의존한다.

    3.8 가용성

    자신을 노출하며 "출판 참조"와 같은 표준 상용 실천의 경계 이외에는 아무 것도 요구하지 마십시오, 고객은 호주 은행 전체 구현은 기밀이다; 그러나 나는 방문 전망을 무료입니다. 당신은 또한 시드니에있는 우리의 사무실에있는 문서를 보려면 (그러나 복사하지)에 오신 것을 환영합니다. 방법론 (구조 및 표준 공개적으로 사용 가능한 6NF 교육 이상)과 유틸리티, 우리의 독점적 인 지적 재산권이며, 과제 사용할 수 있습니다. (가) 나는 우리의 벨트 아래 하나 개의 성공적인 프로젝트가 충분하지 않습니다 합리적으로 (우리의 명성을 다치게하지 않기 위해) 프로젝트의 성공, 그리고 (b)를 확인해야하기 때문에이 단계에서 나는 단지 과제의 일환으로 그것을 판매하고있다 성숙은 '시장을위한 준비'로 분류합니다.

    사실 우리의 IP (문서)를 게시하지 않고, 등, 질문에 대답하고, 어떤 작품 재 도움이 6NF 카탈로그 다시 정보, 조언을 제공하고 무엇을하지 않습니다 계속 기쁘게 생각합니다. 나는 당신을 위해 자격을 갖춘 벤치 마크를 실행하는 것이 행복하다.

    공개 : 경험. 나는 주로 병원과 의료 시스템, 이들 중 몇 가지를 검사했다. 나는 그 두 가지에 시정 과제를 수행했습니다. 해외 공급자가 초기 배달 매우 적절했다, 잘되지 않지만, 그러나 로컬 공급자에 의해 구현 된 확장은 엉망이었다. 이 사이트에 재 EAV에 대해 게시 한 것이 아니라 거의 재앙. 몇 달 강렬한 작품은 잘 그들을 고정.

    4.1 그것은 무엇인가

    내가 일한 한 EAV 구현은 여섯 번째 정규 양식의 하위 집합 단지 것을 나에게 분명했습니다. 그들이 6NF (예. DDL은 변경하지 않고 열을 추가 할 수있는 능력)의 일부 기능을 원하기 때문에 EAV를 구현하는 사람들은 그렇게하지만, 구현하고 관리 할 진정한 6NF, 또는 표준과 구조를 구현하는 학문적 지식이없는 안전하게. 심지어 원래의 제공자는 EAV는 6NF의 부분 집합이었다 6NF에 대한, 또는 알고하지 않았다,하지만 난 그들에게 그것을 지적 할 때 쉽게 동의했다. (; 뷰, 카탈로그 자동 코드 생성) 구조가 EAV, 실제로 6NF, 효율적이고 효과적으로를 제공해야하기 때문에, 공식적으로 EAV 커뮤니티에서 확인되지 않으며, 대부분의 구현에서 누락 된 I 놈 아들 여섯 번째 정규 양식으로 분류 EAV .

    4.2, 정확히, EAV에 대해, "나쁜"는 무엇입니까?

    이것과 다른 스레드의 주석으로 간다, 그래, 심하게 수행 EAV 재앙이다. 더 중요한 것은의 (a) 그들이 그렇게 손실 5NF에서 제공되는 성능 (6NF 잊지) 나쁜와 (b) (코더와 사용자가 번거로운 탐색 기능을 사용하기 위해 "강제"하는) 구현되지 않았습니다 복잡성에서 일반 격리입니다. 그들은 카탈로그를 구현하지 않은 경우에, 예방 오류가 모든 종류의 방지되지 않았을 것입니다. 물론 나쁜 (EAV 또는 다른) 구현에 사실 수 모든하지만 6NF 또는 EAV와 함께 할 nthing있다. 두 프로젝트는 꽤 적절한 성능을 가지고 일했다 (물론,이를 개선 할 수 있지만 더 EAV로 인해 나쁜 성과가 없었다), 그리고 복잡성의 좋은 격리. 물론, 그들은 내 5NF 데이터베이스 또는 내 진정한 6NF 데이터베이스의 품질이나 성능 어디에도 없었다, 그러나 그들은 EAV 지역 사회 내에서 게시 된 문제의 이해의 수준 주어진 공정 충분했다. 그들은 재해와 표준 이하의 말도이 페이지에서 EAV로 주장하지 않았다.

    널 문제라는 잘 알려진 문서화 된 문제가 있습니다. 그것은 그 자체로 에세이의 가치가있다. 이 게시물에 대한 충분할는 대답 :

    내가 EAV 또는 6NF의 지지자 아니다, 나는 품질과 표준의 지지자입니다. 내 위치는 다음과 같습니다

    6.1 같은 것은 같은 무료 점심이 충분하지 않습니다

    그 속담이 언급되었지만, 실제로는 잘못되었습니다. 실제로, 깊이 적용하는 방법은 위와 같이이다 : 당신이 6NF / EAV의 혜택을 원하는 경우, 당신은 더 나은 일을 너무 기꺼이 그것을 (카탈로그, 표준)을 받아야했다. 물론, 추론 당신이 일을하지 않으면, 당신은 혜택을받지 않습니다이다. 데이터 유형의 더 "손실"없다; 값 도메인; 외부 키; 체크 무늬; 규칙. 성능에 관해서는, 6NF / EAV에 대한 성능 저하가 없지만, 슬립 SHOD, 하위 표준 작업에 상당한 성능 저하가 항상있다.

    드디어. 위의 상황을 고려해서, 그것은 작은 팀과 작은 프로젝트라고, 의심의 여지가 없다 :

    끝까지 나와 함께 머물 주셔서 감사합니다.

    A.1 저작자 표시

    내는 "나는 RM에 충실이다"고 주장하고 "업계의 거인 '을 참조, 나는 IT 전문가가 의미하는 것이 무엇인지 이해할 수있는 가정. 겸손 사과.

    A.2 지원 증거

    게시를 위해 삭제되었습니다 시작하는 뭔가. 더 늦게. 좋아,하자 등 네 차례, " 'denormalisation는'성능을 향상"이라는 개념을 지원하는 몇 가지 증거가있다.

    A.3 길이

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

    3.제 1 원칙은 아무 이유없이 재 설계 뭔가 아니다. 즉 현재의 디자인이기 때문에이 옵션을 1로 갈 것입니다 그것은 작업의 입증 된 트랙 기록을 가지고 그래서.

    제 1 원칙은 아무 이유없이 재 설계 뭔가 아니다. 즉 현재의 디자인이기 때문에이 옵션을 1로 갈 것입니다 그것은 작업의 입증 된 트랙 기록을 가지고 그래서.

    대신에 새로운 기능에 대한 재 설계 시간을 보내십시오.

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

    4.나는 처음부터 설계한다면 나는 두 번째로 갈 것입니다. 그것은 당신에게 당신이 필요로하는 유연성을 제공합니다. 그러나 1 번 이미 및 작업이 전체 응용 프로그램에 오히려 중앙 soemting 인으로, 나는 아마 좋은 아이디어없이 주요 설계 변경을주의 할 것입니다 정확히 쿼리, 저장 발동, 뷰, UDF를, 보고서, 수입 등 당신은 변화 할 것이다. 그것이 내가 상대적으로 낮은 위험으로 할 수있는 일이라면 (그리고 장소에 agood 테스트 alrady.) 나는 그렇지 않으면 당신은 새로운 더 버그를 beintroducing 수있는 솔루션 2의 변화에 ​​갈 수 있습니다.

    나는 처음부터 설계한다면 나는 두 번째로 갈 것입니다. 그것은 당신에게 당신이 필요로하는 유연성을 제공합니다. 그러나 1 번 이미 및 작업이 전체 응용 프로그램에 오히려 중앙 soemting 인으로, 나는 아마 좋은 아이디어없이 주요 설계 변경을주의 할 것입니다 정확히 쿼리, 저장 발동, 뷰, UDF를, 보고서, 수입 등 당신은 변화 할 것이다. 그것이 내가 상대적으로 낮은 위험으로 할 수있는 일이라면 (그리고 장소에 agood 테스트 alrady.) 나는 그렇지 않으면 당신은 새로운 더 버그를 beintroducing 수있는 솔루션 2의 변화에 ​​갈 수 있습니다.

    어떠한 경우에도 나는 이런 일에 대한 EAV 테이블을 사용합니다. 그들은 쿼리 및 성능에 대한 끔찍한이며 유연성은 과대 평가 방법 (그들은 일상 성능의 비용으로 프로그램 변경없이 새로운 유형을 3 ~ 4 회를 추가 할 수 있도록 원하는 경우 사용자에게)입니다.

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

    5.첫눈에, 나는 옵션 2 (또는 3)에 갈 것입니다 : 가능하면, 일반화. 옵션 4 내 생각은 매우 관계하지 않고, 쿼리가 복잡 할 것입니다. 그 질문에 직면했을 때, 나는 일반적으로 "사용 사례"에 해당 옵션에 직면 : 이 또는이 작업을 수행 할 때 - 어떻게 디자인 2/3 행동하는 무엇입니까?

    첫눈에, 나는 옵션 2 (또는 3)에 갈 것입니다 : 가능하면, 일반화. 옵션 4 내 생각은 매우 관계하지 않고, 쿼리가 복잡 할 것입니다. 그 질문에 직면했을 때, 나는 일반적으로 "사용 사례"에 해당 옵션에 직면 : 이 또는이 작업을 수행 할 때 - 어떻게 디자인 2/3 행동하는 무엇입니까?

  6. from https://stackoverflow.com/questions/4056093/what-are-the-disadvantages-of-using-a-key-value-table-over-nullable-columns-or by cc-by-sa and MIT license