1

我要构建一个 PHP Web 应用程序并且已经决定使用 Codeigniter + DataMapper(过热版).

我发现 DataMapper(过热版)即使实际上只有一对多关系,也需要使用额外的关联表。

例如,一个国家可以有很多玩家,但一个玩家只能属于一个国家。典型的数据库设计是这样的:

[countries] country_id(pk), country_name
[players] player_id(pk), player_name, country_id(fk)

但是,在 DataMapper 中,它要求设计是这样的:

[countries] country_id(pk), country_name
[players] player_id(pk), player_name 
[asso_countries_players] countries_players_id(pk), country_id(fk), player_id(fk)

这对维护很有好处,因为如果以后我们改变了一个玩家可以属于多个国家/地区的想法,那么只需很少的努力就可以完成。

但是我想知道的是,对于这样的数据库设计,一般来说,与典型设计相比,有没有性能增益或损失?

4

3 回答 3

3

“做任何事情的最快方法就是根本不做。” - Cary Millsap,优化 Oracle 性能

“设计师知道他获得了真正的优雅,不是在没有什么可添加的时候,而是在没有什么可以带走的时候。” ——安托万·德·圣埃克苏佩里

更简单的实现有两个表和三个索引,两个是唯一的。更复杂的实现有三个表和五个索引,四个唯一的。上的索引asso_countries_players.player_name应该是代理 ID - 如果球员的名字发生变化,比如他们结婚或合法地改变它,就像 Chad Ochocinco(nee Johnson)所做的那样,会发生什么?)也必须是唯一的,以强制执行 0.. 1 玩家与国家关系的性质。

如果数据模型不需要关联实体,则将其消除。将 0..1 关系或 1..n 关系转换为 n..n 关系通常非常简单:

  1. 添加关联实体(除非关系本身具有属性,例如开始或结束日期,否则我会质疑是否需要代理键)
  2. 用现有数据填充关联实体
  3. 重新实现外键约束
  4. 删除子表中被取代的外键列。
于 2010-02-18T22:00:26.193 回答
2

选择数据和搜索将意味着更多的连接:您必须处理 3 个表而不是 2 个。

插入数据将意味着更多的插入查询:您必须插入 3 个表而不是 2 个。

所以我猜这可能意味着更多的工作——反过来,这可能会稍微损害性能。

于 2010-02-18T18:07:47.117 回答
1

因为这是一对多的,我个人不会使用关联表,所以完全没有必要。

这个决定对性能的影响不会太大。但是也要考虑数据的上下文,不要只是因为某些程序告诉您而这样做 - 了解您的数据。

于 2010-02-18T20:34:52.543 回答