ERD design pro and contra

时间:2015-07-30 13:21:50

标签: mysql sql sql-server oracle erd

我有一个关于数据库设计的问题。

这是第一个例子: Database schema

User可能有多个Websites,用户可以为其每个网站请求特定资源。所有请求都保存在RequestForResource表中。

现在,如果我想查看请求资源的用户的名称,我必须加入表RequestForResource Website和表User

为避免这种情况,我可以在RequestForResourceUser表之间创建外键,就像在此处演示一样:

Schema 2

现在,为了获取用户名,我必须加入表RequestForResource和表User,这对SQL服务器来说可能更容易,但另一方面我有一个外键更多。

哪种方法更好,(或)更快,为什么?

1 个答案:

答案 0 :(得分:1)

您始终可以复制信息以获得执行速度。这称为:非规范化。是的,它可能会通过降低所需的索引搜索次数来加快查询速度。

BUT

您必须编写代码以确保数据一致: 使用第二种设计,可以为同一站点插入具有不同ID的Website.User_idUserRequestForResource.User_idUser!根据设计,这是有效的(但可能这不符合您的业务规则)。

考虑更新外键约束(或添加第二个约束),该约束仅引用网站表(User_idUserWebsite_idWebsite)并删除User - {{1}一个。

还要考虑构建一个视图,用所有必需的信息(可能带有聚簇索引)查询数据。