문제

객체 지향 프로그래밍에서 슈퍼 클래스처럼 작용하는 DB (Postgres 기반)에 테이블이 있습니다. 여기에는 테이블에 어떤 추가 열이 있는지 결정하는 열 '유형'이 있습니다 (서브 클래스 속성). 그러나 테이블에 가능한 모든 열 (가능한 모든 유형의 속성)을 포함시키지 않기를 바랍니다.

그래서 나는 'key'및 'value'열 (예 : 'filename'= '/file'또는 'some_value'= '5')을 오염시키기로 결정했습니다. 슈퍼 클래스 테이블에서. 또한 사용 가능한 '키'값을 포함하기 위해 하나의 관련 테이블을 만들었습니다.

그러나 이러한 아키텍처에는 문제가 있습니다. '값'열은 기본적으로 문자열 데이터 유형이어야하며 무엇이든 포함 할 수 있어야합니다. 그러나 나는 현으로 전환하는 것이 좋은 결정이라고 생각하지 않습니다. 이 제한을 우회하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

실험하는 디자인은 변형입니다 엔티티 부사장 값, 그리고 그것은 많은 문제와 비 효율성이 있습니다. 최후의 수단을 제외하고는 당신이하고있는 일에 대한 좋은 해결책이 아닙니다.

더 나은 솔루션이 될 수있는 것은 Fallen888이 설명하는 것입니다. 각 하위 유형에 대해 "하위 유형"테이블을 만듭니다. 유한 한 수의 하위 유형이 있으면 괜찮습니다. 그러면 하위 유형별 속성에는 데이터 유형이있을 수 있으며 NOT NULL 적절한 경우 제약 조건이므로 EAV 설계를 사용하는 경우 불가능합니다.

하위 유형 테이블 디자인의 남은 약점 중 하나는 슈퍼 클래스 테이블의 메인 행이 말해야하기 때문에 하위 유형 테이블에 행이 존재한다는 것을 시행 할 수 없다는 것입니다. 그러나 그것은 EAV 디자인이 도입 한 것보다 온화한 약점입니다.

편집하다: 의견에 대한 의견에 대한 추가 정보와 관련하여, 이것은 매우 일반적인 패턴입니다. 많은 사람들 이이 상황에서 사용하는 기술인 "다형성 연관성"이라는 깨진 솔루션을 조심하십시오.

다른 팁

대신 ... 각 하위 유형은 자체 DB 테이블을 얻습니다. 베이스/슈퍼 테이블에는 하위 유형 DB 테이블의 이름이있는 바르 차르 열이 있습니다. 그런 다음 이런 식으로 가질 수 있습니다 ...

Entity
------
ID
Name
Type
SubTypeName   (value of this column will be 'Dog')


Dog
---
VetName
VetNumber
etc

(하위) 테이블 이름이 기본 테이블에서 varchar 값이되기를 원하지 않으면 기본 키가 기본 테이블에있는 하위 유형 테이블 만있을 수도 있습니다.

유일한 해결 방법 (스트루어를 유지하는 동안)은 별도의 테이블을 갖는 것입니다.

create table IntProps(...);
create table StringProps(...);
create table CurrencyProps(...);

그러나 나는 이것이 좋은 생각이라고 생각하지 않습니다 ...

한 가지 일반적인 접근 방식은 키 값 테이블에 여러 열이 포함되어 있으며 각 데이터 유형마다 하나, 즉 StringValue, DecimalValue 등이 포함되어 있습니다.

변경할 필요가없는 데이터베이스 스키마의 쿼리 가능성 및 성능을 거래하는 것을 알고 있습니다. ORM 매핑 또는 객체 데이터베이스를 고려할 수도 있습니다.

유형 당 키/값 테이블을 가질 수 있습니다. 사용 가능한 테이블은 올바르게 타이핑 된 키/값 테이블을 가리려면 특정 키/유형 쌍의 가용성을 인코딩해야합니다.

그러나 이것은 행 기반 관계형 데이터베이스의 경우 비효율적 인 아키텍처처럼 보입니다.

아마도 열 중심의 관계형 데이터베이스를 살펴 봐야합니까?

답변 주셔서 감사합니다. 나는 내가 필요한 것을 조금 더 구체적으로 설명하겠습니다. 블로그+포럼 웹 사이트를 프로그래밍 할 필요가 있으며 WordPress DB 구조.

블로그 항목이나 비디오 파일 첨부와 같이 모든 종류의 '개체'에 의견을 놓을 수있는 능력이 강력합니다. 위의 DB 구조는 확장이 매우 쉽고 우리의 모든 요구를 충족시키는 것이 선택의 이유였습니다.

그러나 그것은 그것을 바꾸는 데 늦지 않았습니다. 이것은 초기 엔지니어링 단계에 있기 때문입니다. 또한 우리의 모델은 이제 완전히 나무 계층 기반 DB처럼 냄새가납니다. 지금은 받아 들일 것입니다 Bill Karwin과 Fallen888 답변,하지만 아마도 나는 완전히 잘못된 방향으로 가고 있습니까?

사용자가 테이블에 새 필드를 추가 할 수있는 정보 :

나는이 모든 사람들이 의견을 말하는 것을 존경합니다.

나는 몇 년 전에 이런 종류의 일에 관심이 있었지만 최근에 약간의 PHP와 MySQL을 제외하고는 거의 코드를 작성했습니다.

당신이 계속 가고 싶다면 괜찮다고 생각합니다. 당신은 새로운 무언가로 끝날 수 있습니다.

이 계획에 냉수를 부어 죄송합니다 - 나는 당신의 노력에 감탄합니다. 내 개인적인 믿음은 당신 이이 방향으로 충분히 멀리 가면 SQL보다 자연어를 더 많이 해석하는 시스템으로 끝날 것입니다. (1970 년경, SQL은 실제로 철자가 있었고 실제로 "구조화 된 영어 쿼리 언어"를 위해 서 있었지만 1970 년대에 표준화 한 후에는 Oracle이 19079 년 최초의 상업적 구현, "영어"Got이라고 생각했습니다. 그들은 그것이 영어의 작은 하위 집합이라고 결정했기 때문에 떨어졌습니다.

나는 직업이 없기 때문에이 지역에서 증기가 부족했습니다. 이 아이디어를 실험 할 수있는 청구서를 지불하는 쉬운 일이 없다면이 분야에 집중하기가 약간 어렵습니다.

모두에게 최고의 소원.

죄송합니다. 위에 19079 년을 썼습니다. 1979 년을 의미했습니다. Oracle은 CIA의 데이터베이스를 작성하는 첫 번째 계약을 받았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top