2012-08-08 87 views
10

我设计一个数据库结构与下面的简单示例:在数据库中有“外键冗余”是否不好?

Team has many members 
Member has many clients 
Client has many projects 

假设我的对象有这些参数:

Team: id, type 
Member: id, team_id, name 
Client: id, member_id, email 
Project: id, client_id 

这是很简单的找到项目的客户端或客户端的成员,或一个成员的团队。

但是,假设我想找一个项目的团队,例如,我必须先找到一个项目的客户,然后是客户的成员,然后是成员的团队。

我可以直接添加TEAM_ID到项目中,像这样:

Project: id, client_id, team_id 

我知道,然而,这增加冗余一定程度,因为这些信息可通过“涨的关系树“。这是一个坏主意吗?

谢谢!

+0

难道你不是指“每个团队成员有很多客户”,“每个团队成员的客户有很多项目”吗? – 2012-08-08 01:07:31

+0

你认为“有害冗余”是什么?你是否在谈论与归一化理论相关的同一种“有害归约”?或者,您是衡量什么是“有害”的另一种措施? – 2012-08-08 10:42:40

回答

2

这是否是一个坏主意取决于数据库的典型用例。

添加额外的外键增加了修改结构(INSERT,UPDATE,如果修改关系,DELETE)的成本。

不是具有额外的外键增加了查询的成本,否则这些查询的成本会因其存在而受益。

如果项目结构变化不大,但您经常查询结构,额外的外键很可能是净积极的。如果有疑问,请使用合理的测试数据创建结构,并对您认为典型的一些查询进行基准测试。

+0

您不必添加FK。您可以简单地制作FKs复合材料。 – 2012-08-08 00:37:59

+0

尽管如此,您管理的密钥越大,更新速度越慢。即使您拥有更宽的密钥,您仍然可以在磁盘页面上放置更少的密钥,并且可以将更少的密钥缓存在可用的RAM中。 – 2012-08-08 02:52:25

1

这不像你必须在这里做4个查询。您只需在单个查询中加入所有表即可。这不会增加很多复杂性,但它确实增加了一点。我会随你所拥有的一起去。