0

我们正在编写一个MMORPG并假设我们有以下表格。这location_dynamic_objects是要大量查询和更新的表。如您所见position_xposition_ylocation_id和对象类型都是重复的。但是,如果我们规范化并使用连接,我们将为选定的数据应用额外的过滤器。我们计划将所有location_static_objectsONCE 发送给客户,因此将它们与location_dynamic_objects. 静态对象表示要渲染的不可移动数据,并在位置加载时向客户端发送一次。动态对象代表经常更新的数据,如玩家、火箭、小行星等,并不断发送给客户端,选择取决于客户端的位置和位置。我们的问题是我们应该放弃规范化来实现性能吗?

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
);
4

1 回答 1

2

因为非规范化增加了数据的冗余,所以它增加了总数据量。因此,非规范化很少能提高对数据的写访问(创建和更新)的性能;反之亦然。此外,即使对于读取查询,非规范化也会牺牲一小组查询(通常只有一个)的性能提高,以降低访问非规范化数据的所有其他查询的性能。如果您为外键约束适当地使用了人工主键,并辅以对自然(主)键的相应唯一性约束,如果您看到通过非规范化获得的性能提升,我会感到惊讶。

于 2013-04-07T05:05:38.487 回答