내 서버에 일종의 포럼 수정 코드가 있습니다. 내 데이터베이스에는 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
으로 실행하여 어떤 시스템이 켜져 있는지 확인한 다음 해당 테이블에서 추가 쿼리를 실행하고 싶지 않습니다. 나는 JOIN
이 gear_*
의 값을 기반으로 모든 필요한 테이블 인 core
에 하나의 쿼리를 선호합니다. 그게 가능할까요?
아직 포럼 수정을 공개하지 않았으므로 실제 효과가 없어도 많은 변경을 할 수 있습니다. :)
.
반드시 정상화해야합니다. 다음은 시작할 수있는 좋은 곳입니다. http://www.informit.com/articles/article.aspx?p=30646 – Kermit
정상화하면 성능이 향상됩니다. 데이터베이스의 작업량이 적기 때문입니다. . – andrewsi
나는 또한 정규화하는 것이 좋습니다 - 어느 경우 든 sql을 최적화하여 원하는 행만 반환해야합니다. – Randy