무한한 양의 '메타'-데이터에 대한 데이터베이스를 설계하는 방법
-
22-07-2019 - |
문제
데이터베이스에 특정 품목을 가변적 인 속성으로 저장하고 싶습니다.
예를 들어:
항목은 'URL'및 'PDF'속성을 가질 수 있습니다.
따라서 문제는 일부 항목이 속성을 가질 수 있고 다른 항목은 많이 가질 수 있다는 것입니다.
이 데이터베이스를 어떻게 설계하겠습니까? 검색 가능하고 성능으로 만드는 방법은 무엇입니까?
스키마는 어떻게 생겼습니까?
감사!
해결책
당신이 후에는 이름이 있습니다. 엔티티 속성 값 (EAV). 그것은이다 "사물 ("엔터티 "또는"개체 ")을 설명하는 데 사용할 수있는 속성 수 (속성, 매개 변수) 수가 매우 광범위하지만 실제로 적용되는 숫자가있는 상황에서 사용되는 데이터 모델 주어진 실체는 비교적 겸손합니다. "
다른 팁
문서 데이터베이스에 완벽한 작업처럼 들립니다.
객체 (항목)로 시작하여 항목 테이블을 만듭니다. 항목이 1 개 이상의 속성을 가질 수 있습니까? 따라서 고유 한 ID로 속성 테이블을 설정하십시오. 이제 많은 항목 (일부는 복제 할 수 있음)과 많은 속성을 보유하는 테이블을 설정합니다 (복제 할 수 있음)
안건
itemid
항목 설명 ...
속성
AttributeId
귀속 ...
itemattributes
로드
itemid
AttributeId
이제 쿼리를 원할 때 원하는대로 테이블과 필터에 가입 할 수 있습니다 ...
EAV (Entity Attribute Value) 모델은 매우 유연합니다. 시맨틱 웹과 쿼리 언어 SPARQL은 EAV를 기반으로합니다. 그러나 어떤 사람들은이 모델에 성능 페널티가 있기 때문에 그것을 좋아하지 않습니다.
데이터베이스에서 고 부하 성능 테스트를 시작하십시오. 코딩을 마치면 너무 늦지 않기 때문에 그렇게하지 마십시오.
편집하다: 선정 진술의 속도에 집중하십시오. 사용자는 검색 할 때 빠른 결과를 기대합니다.
나는 과거에 다음과 같은 필드를 갖도록 이와 같은 테이블을 디자인했습니다.
- ID
- 유형
- 하위 유형
- 값
그런 다음 사용 된 유형과 하위 유형을 정의하는 다른 테이블을 갖게되고 아마도 그 유형과 하위 유형 조합에 대한 데이터 유형을 제공하여 프로그래밍 방식으로 시행 할 수 있습니다.
그것은 예쁘지 않으며, 당신이하지 않으면하고 싶지 않습니다. 그러나 당신이 할 때 내가 찾은 가장 좋은 방법입니다.
업데이트 : 하위 유형을 비워 두는 경우에도 이미 존재하는 것을 하위 분류하기를 원하기 때문에 너무 자주 발생하는 것이 좋습니다. 예제 유형 : 주소를 작성하고 이제 우편 주소 및 청구 주소 및 물리적 주소가 필요합니다.
이러한 종류의 시나리오의 경우 MS SQL 2005에서 XML 유형 열을 사용합니다 ... XML + SQL의 모든 장점이 있습니다. 그것은 SQL-Statement의 일부로 XPath 표현식을 사용하는 것입니다.
그것은 MS SQL 2005의 특징이며, 다른 RDBMS가 이것을 지원하는지 잘 모르겠습니다. 그 의미가 성능이 현명한 것이 무엇인지 잘 모르겠습니다.
다음 필드로 속성 테이블을 만듭니다.
item_id int (또는 ID 유형이 항목 테이블에있는 모든 것에 관계없이) property_name varchar (500) property_value varchar (500)
item_id와 항목의 ID 필드 사이에 외국 키를 설정하면 완료됩니다.
그것이 당신이 SQL에서 다중 관계를하는 방법입니다.
기본 키 "item_id"가있는 "항목"테이블, 기본 키 "Property_ID"가있는 "속성"테이블 및 "항목"테이블이있는 외래 키 "Item_id"가있는 것 같습니다. "속성"에는 Varchar 유형의 열 "이름"및 "value"열이 있습니다.
수행자? 모릅니다.