2012-10-23 7 views
3

예약 소프트웨어에서 사용자 정의 필드를 구현해야합니다. 예를 들어 동적 속성이있는 사용자 그룹을 포함하는 일부 테이블을 확장해야합니다.사용자 정의 필드/속성 모델

또한 각 제품이 사용자 정의 필드를 가질 수있는 제품 테이블 (이상적으로 이러한 필드는 중첩 될 수 있음).

EAV에 대한 검색을 이미했는데 많은 부정적인 의견을 읽었으므로 이러한 디자인에 어떤 디자인을 사용해야할지 궁금합니다.

EAV를 사용하면 많은 조인이 제품 페이지를 정렬하지만, 속성이 생성 될 때마다 그룹/제품 테이블을 변경하고 싶지는 않습니다.

참고 : 나는 유일한 좋은 해결책은 당신이 그룹/제품 테이블, 속성이 생성 될 때마다, 변경하고 싶은 해달라고 무엇을 꽤 많이 이노 디비

+0

AFAIK, 은색 총알이 없습니다. 그것은 모두 단점입니다. 중요한 질문은 당신이 그 데이터로 무엇을 할 것인지입니다. "무한히 유연한"데이터는 무한히 유연한 UI와 많은 사용 사례를 필요로합니다. 유스 케이스부터 시작하여 고정 스키마에서 가능한 한 많이 구현하고 가능한 한 EAV 확장을 최소화하고 XML 필드와 비교하여 가중치를 둡니다. –

+0

또한 경험을 통해 DB 메타 데이터를 사용하여 많은 EAV 관련 쿼리를 생성 할 수 있습니다. 방정식에 추가하십시오. –

+0

감사합니다. 그렇습니다. 주어진 속성으로 제품을 검색 할 수 있어야합니다. '동적 테이블'을 만들 때 약간의 복잡성이 추가됩니다. – student310

답변

2

사용합니다. 고통 스럽네요. 그렇지만 데이터 무결성과 성능 향상을 보장합니다. , ID를

TABLENAME = '고객', 필드 이름은 = '주소': 당신이 그렇게 할 sont 경우

, 당신은 TABLENAME, 필드 이름, ID와 값으로 테이블을 만들 수 있고, 홀드는 말할 수 = 1 (고객 ID) 값 =

를 '고객이 주소'하지만 당신이 말한대로, 그것은 조인의 부하가 필요합니다. 나는 그것이 좋은 해결책이라고 생각하지 않는다. 필자는 그것을 보았지만 정말로 그것을 권고하지는 않는다. 잘 보이기 때문에 보여주는 것, 가능한 해결책 중 하나입니다.

다른 해결책은 column1, column2, column3 등과 같이 테이블에 미리 정의 된 여러 열을 추가하고 필요에 따라 사용하는 것입니다. 이전 솔루션만큼 최악의 솔루션이지만이를 사용하는 주요 ERP를 보았습니다.

메이트는 경험에 비추어 볼 때 여러분이 발견 할 수있는 것이 무엇이든간에 엄청난 노력이 필요하며 구현할 가치가 있습니다. 두통은 유지해야 할 것이므로 테이블에 필드를 추가하는 것보다 큽니다. 간단하고 정확하게 유지하십시오.

+0

감사합니다. 나는이 해결책을 볼 필요가있다. 나는 누군가가 제품 하나당 하나의 테이블에 대해 이야기하는 다른 포스트를 읽고있다. 빈 칸이 많이 생기는 것을 피할 수 있다고 생각합니다. 이 방법을 사용하면 UI는 phpmyadmin – student310

+0

제품 당 하나의 테이블처럼 보일 것입니다. 너 무슨 뜻이야? (그냥 내 대답에 작은 작은 덧글을 추가) – Diego

+2

http://stackoverflow.com/a/884279/1288927 – student310

0

두 개 이상의 테이블을 추가하여이 작업을 수행 할 수 있습니다. 하나의 테이블에는 속성 고유 키 (attr_id)와 속성 값 (예 : 속성 이름 및 비즈니스 로직에서 필요로하는 다른 값)이 포함됩니다.

두 번째 테이블은 당신의 말 제품 테이블 사이의 조인 및 테이블 속성 및 다음과 같은 필드가 있어야 게재되는 : 당신이 원하는대로

(id, product_id, attr_id) 

이 방법, 당신은 많은 동적 속성을 추가 할 수 있으며 데이터베이스 스키마를 미래의 증거가 될 것입니다.

이제 쿼리에 2 개의 테이블을 더 추가해야한다는 단점이 있습니다.

+0

EAV가 아닌가요? –

2

전적으로 EAV를 기반으로 한 프로젝트를 진행하고 있습니다. 나는 EAV가 일을 복잡하고 느리게 만드는 데 동의하지만, 새로운 속성을 추가하기 위해 데이터베이스 구조 나 코드를 변경할 필요가 없으며 데이터베이스 테이블의 데이터 사이에 계층 구조를 가질 수 있다는 점에서 장점이 있습니다.

모든 장소에서 EAV를 사용하면 시스템이 매우 느려질 수 있습니다.

그러나 현명하게 사용하면 Eav는 매우 유용합니다. EAV를 기반으로 전체 DB를 설계하지 않겠습니다. 일반 속성과 유용한 속성을 나누어 플랫 테이블에 넣고 추가 속성 (클라이언트 또는 다양한 요구 사항에 따라 변경해야 할 수도 있음)에 대해서는 EAV를 사용합니다.

이렇게하면 EAV의 이점을 얻을 수 있습니다. EAV는 많은 어려움없이 원하는대로 유연성을 제공합니다.

이것은 단지 나의 제안 일뿐 더 나은 해결책 일 수 있습니다.

관련 문제