2012-08-22 2 views
1

내 서버에 일종의 포럼 수정 코드가 있습니다. 내 데이터베이스에는 HUGEcore이라는 테이블이 있습니다.이 테이블에는 기본적으로 모든 관리 편집 가능한 설정이 포함되어 있습니다. 그 중 많은 설정이 있습니다. 제 질문은 정상화해야한다는 겁니다. http://sqlfiddle.com/#!2/f4536/1이 테이블을 정규화하여 성능을 향상시킬 수 있습니까?

당신은 일부 열은 특정 시스템이 켜져 있는지 여부 등 gear_notifications, gear_bank, gear_* 다음은 표시라고 볼 수 있습니다 :

나는이 테이블이 얼마나 큰을 보여주기 위해 바이올린을 만들었습니다. 예를 들어, gear_bank=1이면 은행 시스템이 켜집니다. 순간, 내 DB 파일의 __construct에, 나는 다음과 같은 쿼리를 실행하십시오이 JOIN 당신이 바로 여기에 문제를 볼 수 있습니다 무시

$settings = mysql_query("SELECT GROUP_CONCAT(d.domain) AS domains, GROUP_CONCAT(d.zb) AS zb_info, c.* FROM core c JOIN domains d ON d.cid = c.id WHERE c.id ='$cid' LIMIT 1"); 

을; 이 쿼리는 해당 시스템이 켜져 있는지 여부에 관계없이 core 테이블에서 모든 필드를 반환합니다. 예를 들어, gear_bank=0 인 경우 쿼리는 여전히 bank_name, bank_history_perpage, bank_* 등을 반환합니다. 코드가 실행되는 방식에 물리적 인 문제는 없지만 (필요하지 않은 데이터는 무시할 수 있음) 그 데이터를로드 할 필요가 없다면 더 좋습니다.

나는 하나 개의 테이블을 만드는 것이 더겠습니까 후, 해당 값에 해당하는 테이블 (core_bank, core_* 등) 모든 gear_* 값이있는 core라고?

나는 잠시 동안 이것 (불쌍한 말장난, 미안 해요!)을 질문 해왔고, 이것이 내 코드에 성능 향상을 제공 할 수 있을지 잘 모르겠습니다. 위 쿼리는 모든 페이지에서 실행됩니다.

새로운 시스템, 즉 여러 테이블로 되돌리려면 필요한 모든 정보를 어떻게 얻을 수 있습니까? 하나의 쿼리를 core으로 실행하여 어떤 시스템이 켜져 있는지 확인한 다음 해당 테이블에서 추가 쿼리를 실행하고 싶지 않습니다. 나는 JOINgear_*의 값을 기반으로 모든 필요한 테이블 인 core에 하나의 쿼리를 선호합니다. 그게 가능할까요?

아직 포럼 수정을 공개하지 않았으므로 실제 효과가 없어도 많은 변경을 할 수 있습니다. :).

+0

반드시 정상화해야합니다. 다음은 시작할 수있는 좋은 곳입니다. http://www.informit.com/articles/article.aspx?p=30646 – Kermit

+0

정상화하면 성능이 향상됩니다. 데이터베이스의 작업량이 적기 때문입니다. . – andrewsi

+0

나는 또한 정규화하는 것이 좋습니다 - 어느 경우 든 sql을 최적화하여 원하는 행만 반환해야합니다. – Randy

답변

0

코어를 여러 테이블로 분할하면 NULL을 사용하여 특정 항목에 특정 시스템에 대한 정보가 있는지 여부를 나타낼 수 있습니다. 조인은 예상대로 작동합니다.

그러나 테이블이 실제로 그렇게 크지는 않으며 응용 프로그램 수준에서 속도 향상을 실제로 깨닫게 될지 의심 스럽습니다.

그리고 개별 열을 쿼리 할 필요가없는 경우 하나의 TEXT 열만 사용하고 모든 특성을 배열에 넣은 다음 배열을 텍스트 열로 직렬화하십시오.

+0

'JOIN'과'NULL'을 사용하여 실행하는 예제 쿼리를 줄 수 있습니까? –

+0

그냥 왼쪽으로 조인하면 트릭이 나옵니다. sql은 외래 키가 NULL이면 다른 테이블에 연결할 필요가 없다는 것을 충분히 알기 쉽습니다. – Cerad

관련 문제