2010-12-02 5 views
2

Google지도 API를 사용하여지도에 점을 표시하는 매핑 응용 프로그램을 만들고 있습니다. 모든 포인트는 현재 MySQL 데이터베이스 (5M + 레코드를 보유하고 있음)에서 가져옵니다. 현재 모든 엔터티는 개별 속성을 나타내는 특성이있는 별도의 테이블에 저장됩니다.프로그래머가 따라야 할 데이터베이스 디자인 규칙

이 제시 다음과 같은 문제 :

  1. 우리는 데이터베이스, 응용 프로그램 코드와 프런트 엔드의 변경을해야 새 속성이있을 때마다. 이것은 괜찮지 만 모든 엔티티에 대해 일부 속성을 추가해야하므로 50 개 이상의 다른 테이블을 통과하고 새 속성을 추가하는 것은 악몽이됩니다.

  2. 주어진 속성을 공유하는 모든 엔티티를 찾는 방법은 없습니다. 지리학 부서가있는 모든 학교/대학 또는 대학을 찾을 방법이 없습니다 (학교, 대학 및 단과 대학을 따로 질문하지 않고).

  3. 속성을 제거하는 것도 마찬가지입니다.

  4. 개별 테이블의 속성을 정의하기위한 표준이 없습니다. 다른 테이블에 다른 이름이나 데이터 형식으로 동일한 속성이 존재할 수 있습니다.

  5. 속성에 따라 포인트를 연결하거나 그룹화 할 수 없습니다 (포인트 2와 어떻게 든 관련됨).

우리는 DBA의 도움과 전문 DB 설계 경험 부족으로 전체 데이터베이스를 재 설계하려고합니다. 우리는 정말 고심하고 있습니다.

새로운 디자인이 직면 한 또 다른 문제는 엔티티간에 많은 공유 속성/속성이 있다는 것입니다. 예를 들어

:

"대학"라는 기업은 100 개 이상의 특성을가집니다. 다른 기관 (예 : 병원, 은행 등)은 기계, 주차, 카페테리아 등의 대학과 꽤 많은 특성을 공유합니다.

우리는 실제로 별도의 테이블에 속성을 갖고 싶지 않으며 엔티티 w/foreign keys]를 사용하면 수동으로 추가/제거해야합니다. 또한 속성을 일반화하면 50 개 이상의 속성을 포함하는 그룹이 생성됩니다. 모든 레코드 (즉, 엔터티)가 이러한 속성을 필요로하지는 않습니다.

  • 는 예를 들어, 몇 가지 기본 정보를 포함하는 각 개체에 대해 별도의 테이블을 가지고 :

    그래서 마음에 유지 여기 우리가 새로운 디자인에 대해 생각하고 무엇을 ID, 이름, 등 등

  • 는 속성 정보를 저장하기 위해이 개 테이블 속성 유형속성 되세요.

  • 링크 각 실체 (또는 당신이 좋아하는 경우 테이블) 다 대다 관계를 이용하여 속성합니다.

  • 이라는 다른 테이블에 주소를 저장하면 외래 키를 통해 개의 링크 엔티티가 지정됩니다.

우리는 속성을 추가, 제거 또는 쿼리 할 때 더욱 유연해질 것이라고 생각합니다. 20+는 단일 행에 관련된 모든 속성을 가져 조인과 함께 우리는 쿼리가있을 수 있습니다 특정 대학에 대한 " 속성 "모두 표시 egto 데이터를 가져 오는 경우

이 디자인하지만, 조인의 수가 증가가 발생합니다 .

우리는이 디자인 접근법에서 몇 가지 의견이나 가능한 결함을 필연적으로 알아야합니다.

감사합니다.

답변

1

더 구체적인 예를 사용하지 않고 질문을 일반화하려는 시도에서 진정으로 자신의 접근 방식을 비판하기는 어렵습니다. 좀 더 깊이있는 분석을 원한다면 ER diagram을 이용해보십시오.

데이터 모델이 너무 많이 변경되어 속성을 계속 추가/제거하고 이러한 속성 중 많은 부분이 중복되는 경우 EAV을 사용하는 것이 좋습니다.

그렇지 않은 경우 관계형 접근 방식을 유지하면서 속성과 중복되는 부분이 많으면 엔터티를 분석하고 해당 항목에 연결되는 추상화를 찾을 수 있습니다.

예) My Db에는 모두 hasFur 및 furColor 속성을 가진 Puppies, Kittens 및 Walruses가 있습니다. 3 개의 테이블에서 해당 속성을 제거하고 각 속성에 연결된 FurryAnimal 테이블을 만듭니다.

물론 가장 간단한 대답은 데이터 모델을 만지지 않는 것입니다. 대신 (5), (4) 및 (2)를 처리하는 데 사용할 수있는 기본 테이블에 Views을 만드십시오.

+4

물론 EAV는 지금까지 본 최악의 악몽 일 수 있습니다. – HLGEM

+0

다시 일찍 돌아 오지 못해 죄송합니다. 데이터 모델이 많이 변경되어 결국 속성을 자주 추가하거나 제거하게됩니다. 또한 우리는 사용자가 사용자 정의 속성을 추가 할 수 있도록해야합니다. 그래서 나는 하이브리드 EAV 구조를 생각하고있었습니다. BTW 나는 몇 가지 예제 승/질문을 업데이 트했습니다. – nka

1

1은 문제가되지 않습니다. 개체가 정의 된 곳이 한 곳 있습니다. 그 밖의 모든 것은 생성/파생됩니다. 이 때까지 코드를 리팩터링하십시오.

2는 속성이 어디에 있는지 설명하는 메타 모델을 사용하여 해결됩니다. 이것은 아마도 1에도 필요합니다.

Gemstone 객체 지향 데이터베이스에서 Seaside으로 Smalltalk에서 프로그래밍하여이 문제를 완전히 피하고자 할 수 있습니다. 그런 다음 컬렉션이있는 개체를 가질 수 있으며 너무 많은 조인이 필요하지 않습니다.