2013-04-06 2 views
0

우리는 MMORPG을 쓰고 있으며 다음 표가 있다고 가정합니다. location_dynamic_objects은 쿼리되고 무겁게 업데이트 될 테이블입니다. position_x에서 볼 수 있듯이 position_y, location_id 열은 개체 유형과 마찬가지로 복제됩니다. 그러나 조인을 정규화하고 사용하는 경우 선택한 데이터에 대해 추가 필터를 적용해야합니다. 우리는 모든 location_static_objects ONCE를 클라이언트에 보내려고하므로 location_dynamic_objects과 함께 유지하는 것이 중요하지 않습니다. 정적 객체는 렌더링 할 수있는 이동 불가능한 데이터를 나타내며 위치로드시 클라이언트에 한 번 보냅니다. 동적 객체는 플레이어, 로켓, 소행성 등과 같이 자주 업데이트되는 데이터를 나타내며 클라이언트 위치 및 위치에 따라 클라이언트에 지속적으로 전송됩니다. 성능을 달성하기 위해 정규화를 포기해야할까요?RDBMS 정규화 대 성능

create table location_static_object_types (
    location_static_object_type_id integer auto_increment primary key, 
    object_type_name    varchar(16) not null 
); 
create table location_static_objects (
    location_static_object_id  integer auto_increment primary key, 
    location_static_object_type_id integer not null, 
    location_id     integer not null, 
    position_x      integer not null, 
    position_y      integer not null 
); 
create table location_dynamic_object_types (
    location_dynamic_object_type_id integer auto_increment primary key, 
    object_type_name    varchar(16) not null 
); 
create table location_dynamic_objects (
    location_dynamic_object_id  integer auto_increment primary key, 
    location_dynamic_object_type_id integer not null, 
    object_native_id    integer not null, 
    location_id      integer not null, 
    position_x      integer not null, 
    position_y      integer not null 
); 
+1

조인이 있거나 2 개의 성능이 망가질 수 있기 때문에 확실하지 않습니다. 적절한 색인 생성, 조정, 어쩌면 일부 응용 프로그램 캐싱을 사용하면 필요한만큼 빠르게 작업을 수행 할 수 있습니다. – mconlin

+1

철저한 테스트를 거쳤으며 정상적인 양식으로 돌아 가야한다는 증거가있을 때만 정상화해야합니다. – Kermit

+0

인덱스를 추가하더라도 객체 유형을 필터링해야하며 필터링되지 않은 데이터를 클라이언트에 보내야합니다. – OneMoreVladimir

답변

2

비정규 화는 데이터의 중복성을 증가 시키므로 전체 데이터 볼륨을 증가시킵니다. 이러한 이유 때문에 비정규 화 (denormalization)가 데이터에 대한 쓰기 액세스 (작성 및 업데이트)의 성능을 향상시키는 것은 거의 없습니다. 그 반대의 경우는 일반적으로 사실입니다. 또한 읽기 쿼리의 경우에도 비정규 화는 비정규 화 된 데이터에 액세스하는 모든 다른 사용자의 성능이 저하되는 경우 작은 쿼리 집합 (성능이 저하 된 쿼리 집합)의 성능을 향상시킵니다. 자연 키 (기본 키)에 해당하는 고유성 제약 조건을 보완하여 외래 키 제약 조건에 대해 인공 기본 키를 적절히 적용한 경우 비정규 성을 통한 성능 향상을 보았을 때 나는 놀랐습니다.

+0

나는 일반적으로 당신과 동의합니다. 그러나 나는 "적절한 정규화"가 인공적인 기본 키의 사용과 관련된다는 암시를 좋아하지 않는다. 이 두 가지는 서로 관련이 없습니다. –

+0

인공적인 기본 키와 관련하여 필자의 말은 실제로 "적절하게 고용되어"있으며 이는 성능에 영향을 미친다. –