복붙노트

[SQL] 유연한 추상적 인 테이블 대 다수의 열이 하나의 고정 된 테이블

SQL

유연한 추상적 인 테이블 대 다수의 열이 하나의 고정 된 테이블

당신이 (매점, 식당, 클럽, 호텔, 이벤트) 다른 분야를 필요로 열이있는 테이블을 생성의 이익이 그렇게 같이 정의 명부의 12 개의 다른 유형의 웹 사이트가 있는지 궁금 해서요 예 숍 :

shop_id | name | X | Y | city | district | area | metro | station | address | phone | email | website | opening_hours

또는이에 더 추상적 인 접근 방식과 유사한

object_id | name        
---------------
1         | Messy Joe's  
2         | Bate's Motel 

type_id | name
---------------
1       | hotel
2       | restaurant


object_id | type_id
---------------
1         | 2
2         | 1

field_id | name           | field_type
---------------
1        | address        | text
2        | opening_hours  | date 
3        | speciality     | text

type_id | field_id
---------------
1       | 1
1       | 2
2       | 1
2       | 3

object_id | field_id | value
1         | 1        | 1st street....
1         | 3        | English Cuisine

값의 미리 정의 된 경우 물론 더 추상적 일 수있다 (예 : 전문 자신의 목록을 가질 수있다)

나는 추상적 인 접근을하는 경우는 매우 유연 할 수 있지만, 쿼리는 조인의 많은 복잡 할 것입니다. 이이 '더 복잡한'쿼리를 실행, 성능에 영향을하지만 모르겠어요.

나는 두 가지 방법의 위쪽과 단점이 무엇인지에 관심이있을 것입니다. 난 그냥 자신을 위해 상상할 수있는,하지만 난이를 확인하기 위해 경험이 없습니다.

해결법

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

    1.어떤 문제가 명확하게 우리가 합리적인 토론을 체결하기 전에 해결해야합니다.

    어떤 문제가 명확하게 우리가 합리적인 토론을 체결하기 전에 해결해야합니다.

    전제 조건 해결

    이제, 우리는을 시작할 수 있습니다

    토론

    확실한. 그러나 너무 "추상적"하지 않습니다. 일관성을 유지하고 다른리스트와 같은 EAV에 (또는 6NF) 방식 등의 목록을 구현합니다.

    긴 게시물을 용서.

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

    2.귀하의 질문에, 당신은 같은 시간에 두 개 이상의 주요 이슈를 제시 하였다. 그 두 가지 문제는 E-A-V 및 발전기 사양입니다.

    귀하의 질문에, 당신은 같은 시간에 두 개 이상의 주요 이슈를 제시 하였다. 그 두 가지 문제는 E-A-V 및 발전기 사양입니다.

    첫째, E-A-V에 대한의 이야기를하자. 귀하의 마지막 테이블 (것으로, object_id, FIELD_ID, 값)은 본질적으로 E-A-V입니다. E-A-V 및 E-A-V에 아래쪽으로 거꾸로있다. 거꾸로 구조는 거의 모든 주제를 기술하는 데이터의 거의 모든 신체를 수용 할 수 있도록 일반적이기 때문이다. 당신은 어떤 데이터 분석 및 주제의 어떤 이해를 설계 및 구현을 진행하고, 할 수없는 그 말은 잘못된 가정에 대해 우려하고있다. 아래쪽 측면은 검색 시간에, 당신은 당신이 평균 아무것도 그 쿼리를 마련하기 위해, 데이터 기반을 구축하기 전에 스킵하는 데이터 분석을해야한다는 것입니다. 이것은 단지 검색의 효율성보다 훨씬 더 심각합니다. 그러나 당신은 또한 검색 효율 끔찍한 문제가있는 것입니다. 그것을 통해 라이브 또는이있는 사람들에서 읽어 :이 함정에 대해 배울 수있는 두 가지 방법이 있습니다. 나는 독서를 권장합니다.

    둘째, 당신은 발전기 사양 경우가 있습니다. 당신의 표 (OBJECT_ID, TYPE_ID) 관련 테이블과 함께, 발전기 사양 (일반화 전문화) 패턴을 캡처합니다. 나는 호텔과 레스토랑 사이에 일반화해야한다면, 나는 그것을 "대중 방을"또는 "장소"와 같은 무언가를 호출 할 수 있습니다. 그러나 나는 확실히 나는 당신의 사건을 이해하지거야, 당신은 훨씬 더 일반적인 두 이름이 제안하는 것보다 뭔가를 구동 할 수있다. 결국, 당신은 당신의 목록에서 "이벤트"를 포함 시켰습니다, 그리고 이벤트가 내 마음에 장소의 유형이 아닙니다.

    나는 발전기 사양 및 이전 응답의 관계형 모델에 측정 값에 다른 사람을 언급했습니다. 두 개의 테이블이 매우 유사 할 때, 때를 결합해야 하는가?

    당신이 당신의 데이터베이스를 구축하기 전에 데이터의 관계형 모델을 마련하려는 것이 나에게 분명하지 않다 때문에하지만, 같은 방향으로 당신을 보내 주저. 데이터 본체와 동일한 데이터의 E-A-V 모델의 관계 모델은 서로 상충 거의 완전히이다. 당신이 당신도 데이터의 관계형 모델에서 발전기 사양을 표현하는 방법을 탐구하기 전에 그 선택을해야 할 날 것으로 보인다.

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

    3.당신은 다른 엔티티 (또는 전에 ...)의 큰 숫자를 요구하기 시작하면되는 NoSQL 솔루션 중 하나를 선택보다 훨씬 더 간단 할 것이다. 그냥 당신이 필요로하는 정확한 필드와 각 엔티티 / 기록을 저장합니다.

    당신은 다른 엔티티 (또는 전에 ...)의 큰 숫자를 요구하기 시작하면되는 NoSQL 솔루션 중 하나를 선택보다 훨씬 더 간단 할 것이다. 그냥 당신이 필요로하는 정확한 필드와 각 엔티티 / 기록을 저장합니다.

    {
       "id": 1,
       "type":"Restaurant",
       "name":"Messy Joe",
       "address":"1 Main St.",
       "tags":["asian","fusion","casual"]
    }
    
  4. ==============================

    4.은 "추상적 인"접근 방식이 더 나은 "정상화"로 알려져, 제 3 정규형 (3NF)처럼 보인다.

    은 "추상적 인"접근 방식이 더 나은 "정상화"로 알려져, 제 3 정규형 (3NF)처럼 보인다.

    다른 하나는 당신이하지 전에, 표준화 된 접근 방식을 사용하여 속도 문제가 발생했습니다 때 ... "비정규"라고하며, 유효한 성능 옵션이 될 수 있습니다.

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

    5.어떻게이 명부 코드로 표현해야합니까? 나는 서브 타입으로 등, 숍,의 restuarant와 함께, 슈퍼로 목록 추측에는 요?

    어떻게이 명부 코드로 표현해야합니까? 나는 서브 타입으로 등, 숍,의 restuarant와 함께, 슈퍼로 목록 추측에는 요?

    그래서 가정이 관계형 데이터베이스에 서브 타입을 매핑하는 방법의 경우이다. 세 가지 선택 사항은 일반적으로 있습니다 :

    올바른 해결책은 보편적 없습니다. 내 취향은 옵션 3으로 시작하는 일반적; 그것은 꽤 잘 정규화와 함께 일할 수있는 intituitive 구조를 제공하고 쉽게 확장 할 수 있습니다. 그것은 하나의 각 인스턴스를 검색하기위한 결합을 의미합니다 -하지만 RDBMS는 잘 연습에서 성능 문제가 발생하지 정말 않도록 조인하고 최적화되어 있습니다.

    다른 테이블의 모든 슈퍼 타입의 인스턴스 (외래 키의 확산)를 참조해야하는 경우 옵션 2 쿼리 (어떤 조인)하지만 원인이 문제에 대한 더 확대됨에 될 수 있습니다.

    (1) 변화에 탄력이 아니다 : 첫눈에 옵션 1이 나타납니다 2 개주의 있지만, 가장 성능이 좋은 수 있습니다. 새 서브 타입 (그래서 다른 특성)을 추가하는 경우에는 테이블 구조를 변경하고 마이그레이션해야합니다. (2) 것보다 덜 효율적이 될 수 있습니다. 테이블 인구가 희소하기 때문에, 어떤 DB를 특히 효율적으로 저장하지 않습니다. 결과적으로는 옵션 1보다 efficicent 할 수있다 - 할 수있는 쿼리 엔진이 빠르게 부풀어 스파 스 테이블 스페이스를 검색 할 수 있습니다보다 조인 때문이다.

    어떤 선택하는 것이 정말 문제의 세부 사항을 알고 내려 온다. 나는 옵션에 조금을 읽는 게 좋을 것 :이 문서가 시작하기 좋은 장소입니다.

    HTH

  6. from https://stackoverflow.com/questions/4011956/single-fixed-table-with-multiple-columns-vs-flexible-abstract-tables by cc-by-sa and MIT license