我有一个关于数据库设计的问题。
User
可能有多个Websites
,用户可以为其每个网站请求特定资源。所有请求都保存在RequestForResource
表中。
现在,如果我想查看请求资源的用户的名称,我必须加入表RequestForResource
Website
和表User
。
为避免这种情况,我可以在RequestForResource
和User
表之间创建外键,就像在此处演示一样:
现在,为了获取用户名,我必须加入表RequestForResource
和表User
,这对SQL服务器来说可能更容易,但另一方面我有一个外键更多。
哪种方法更好,(或)更快,为什么?
答案 0 :(得分:1)
您始终可以复制信息以获得执行速度。这称为:非规范化。是的,它可能会通过降低所需的索引搜索次数来加快查询速度。
BUT
您必须编写代码以确保数据一致:
使用第二种设计,可以为同一站点插入具有不同ID的Website.User_idUser
和RequestForResource.User_idUser
!根据设计,这是有效的(但可能这不符合您的业务规则)。
考虑更新外键约束(或添加第二个约束),该约束仅引用网站表(User_idUser
,Website_idWebsite
)并删除User
- {{1}一个。
还要考虑构建一个视图,用所有必需的信息(可能带有聚簇索引)查询数据。