2009-12-18 2 views
0

다른 주요 섹션이 별도의 테이블로 분리되어있는 분류 된 MySQL 데이터베이스를 재구성하고 있습니다. 예를 들어 판매 품목에는 고유 한 ID가있는 고유 한 테이블이 있고 작업에는 고유 한 ID가있는 고유 한 테이블이 있으며 개인은 자체 테이블을 가지고 있습니다.효율적인 분류 MySQL의 구조

이 섹션 모두가 공유 몇 가지 일반적인 특성 :

-id
-title

-listing 상태 -posting
-poster
-reply 이메일
날짜

하지만 각각 별도의 정보가 필요합니다.

- 각각 다른 종류의 카테고리 및 나무를 선택할 수 있습니다 (저장에 필요한 구조에 영향을 미침)
- 직장에서 연봉, 시작일 등을 저장해야합니다.
- 상품을 저장해야하는 항목이 필요합니다. 가격, obo 등등. 따라서 보편적 인 테이블에 상관없이 섹션을 불문하고 모든 일반 목록 정보를 저장할 수있는 작은 테이블에 사용자 정의 된 데이터 저장소를 작업 할 수있는 동안 리팩토링하는 것이 좋습니다. 또는 현재 구조 만 남겨두고 섹션을 분리 된 상태로 두는 것이 낫습니다.

답변

0

단일 테이블을 사용하지 마십시오. 관계형으로 이동하십시오.

설정을 권장하는 것은 "기본"테이블 (공통 특성이있는 테이블)과 특정 정보가 포함 된 세 테이블 사이의 소위 다형성 관계입니다.

기본 테이블

  • ID
  • 제목
  • ...
  • 범주 이름 (VARCHAR 또는 CHAR)
  • CATEGORY_ID (정수)
  • : 구조는 다음과 같을 것

카테고리 테이블

  • ID
  • (특정 열)

CATEGORY_NAME 필드는 예를 들면 특정 범주 테이블의 테이블 명을 포함한다.'job_category'이고 category_id는 카테고리 테이블의 ID를 가리켜 야합니다. 예는 다음과 같을 것이다 :

# MAIN TABLE 
id | title   | ... | category_name | category_id 
------------------------------------------------------- 
123 | Some title | ... | job_category | 345 
321 | Another title | ... | sale_category | 543 

# SPECIFIC TABLE (job_category) 
id | ... 
--------- 
345 | ... 

# SPECIFIC TABLE (sale_category) 
id | ... 
--------- 
543 | ... 

을 이제 메인 테이블을 쿼리 할 때마다, 당신은 즉시에서 추가 데이터를 가져 오기 위해 어떤 테이블 알 것이다, 당신은 그 테이블의 ID를 알 수 있습니다. 이 방법의 유일한 단점은 하나의 단일 항목에 대한 정보를 가져 오기 위해 두 가지 별도의 쿼리를 수행해야한다는 것입니다. 그러나 트랜잭션에서이 작업을 수행 할 수도 있습니다.

다른 방법으로 데이터를 가져 오는 경우 (예 : jobs_category에서 항목을 검색하는 경우), JOIN을 사용하여 주 테이블에서 관련 데이터를 가져올 수 있습니다. main.category_id = jobs_category.id뿐만 아니라 category_name 열을 조인 조건으로 사용하는 것을 잊지 마십시오. 그렇지 않으면 다른 범주 중 하나에 속한 데이터를 가져올 수 있습니다.

최적의 성능을 얻으려면 category_name 및 category_id 열의 색인을 할 수 있습니다. 이는 이전 단락에서 설명한 것처럼 두 테이블을 조인하는 모든 쿼리의 속도를 향상시킵니다.

희망이 도움이됩니다.

2

그들은 서로 상관 관계가없는 별도의 엔티티처럼 들립니다 (일부 열 정의를 공유하는 경우 ecxept), 맞습니까?

혹시 그렇지 않으면 내가 하나 개의 테이블로 병합 것이라고 생각하지 않는다

SELECT * 
FROM main_entity 
WHERE entity_type IN ('SALE_ITEM', 'JOB', 'PERSONAL')? 

같은 선택을 하시겠습니까.

관련 문제