ERD设计正反

ERD design pro and contra

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

这是第一个例子:

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

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

为了避免这种情况,我可以在 RequestForResourceUser table 之间创建外键,如下所示:

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

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

您可以随时复制信息以提高执行速度。这称为:非规范化。是的,它可能会通过减少所需的索引查找次数来加快查询速度。

但是

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

考虑更新仅引用网站 table(User_idUserWebsite_idWebsite)的外键约束(或添加第二个约束)并删除 User-RequestForResource一个.

同时考虑构建一个视图以使用所有必需的信息(可能使用聚簇索引)查询您的数据。