ERD设计正反
ERD design pro and contra
我有一个关于数据库设计的问题。
这是第一个例子:
User
可能有多个Websites
,用户可以为他的每个网站请求特定的资源。所有请求都保存在 RequestForResource
table 中。
现在,如果我想查看请求资源的用户的名称,我必须加入 tables RequestForResource
Website
和 table User
。
为了避免这种情况,我可以在 RequestForResource
和 User
table 之间创建外键,如下所示:
现在,为了获得用户名,我必须加入 table RequestForResource
和 table User
这对 SQL 来说可能更容易服务器,但另一方面我还有一个外键。
哪种方法更好和(或)更快,为什么?
您可以随时复制信息以提高执行速度。这称为:非规范化。是的,它可能会通过减少所需的索引查找次数来加快查询速度。
但是
您必须编写代码以确保数据一致:
使用第二种设计,可以为同一站点插入具有不同 ID 的 Website.User_idUser
和 RequestForResource.User_idUser
!根据设计,这是有效的(但可能不满足您的业务规则)。
考虑更新仅引用网站 table(User_idUser
、Website_idWebsite
)的外键约束(或添加第二个约束)并删除 User
-RequestForResource
一个.
同时考虑构建一个视图以使用所有必需的信息(可能使用聚簇索引)查询您的数据。
我有一个关于数据库设计的问题。
这是第一个例子:
User
可能有多个Websites
,用户可以为他的每个网站请求特定的资源。所有请求都保存在 RequestForResource
table 中。
现在,如果我想查看请求资源的用户的名称,我必须加入 tables RequestForResource
Website
和 table User
。
为了避免这种情况,我可以在 RequestForResource
和 User
table 之间创建外键,如下所示:
现在,为了获得用户名,我必须加入 table RequestForResource
和 table User
这对 SQL 来说可能更容易服务器,但另一方面我还有一个外键。
哪种方法更好和(或)更快,为什么?
您可以随时复制信息以提高执行速度。这称为:非规范化。是的,它可能会通过减少所需的索引查找次数来加快查询速度。
但是
您必须编写代码以确保数据一致:
使用第二种设计,可以为同一站点插入具有不同 ID 的 Website.User_idUser
和 RequestForResource.User_idUser
!根据设计,这是有效的(但可能不满足您的业务规则)。
考虑更新仅引用网站 table(User_idUser
、Website_idWebsite
)的外键约束(或添加第二个约束)并删除 User
-RequestForResource
一个.
同时考虑构建一个视图以使用所有必需的信息(可能使用聚簇索引)查询您的数据。