【问题标题】:ERD design pro and contraERD 设计赞成和反对
【发布时间】:2015-10-21 21:12:59
【问题描述】:

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

这是第一个例子:

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

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

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

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

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

【问题讨论】:

  • 我认为这个问题最好在 dba 中提出。顺便说一句,您如何链接资源和网站?没有这个链接就不可能满足查询。如果每个表中都有很多 id...它们都需要吗?
  • 如果您将 UserID 放在 RequestForResource 中,您可能会考虑将其从网站中删除。
  • @TabAlleman 是的,但同样,如果我想要用户的所有网站,这种关系很方便:)
  • 您可以从 RequestForResource 获取该信息。

标签: mysql sql sql-server oracle erd


【解决方案1】:

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

但是

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

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

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

【讨论】:

  • 那么在实际系统上的实际应用程序中,这通常是如何完成的?我不想按照理论(书籍)听到你应该以这种方式或以这种方式去做。是否有针对特定情况的推荐方法?
  • “特定”部分取决于很多事情(从数据库下的硬件到业务规则和决策)。这里有一些问题:(是的,在真实的环境中,你应该先问问题):你现在真的需要这种非规范化吗?这是一个真正的瓶颈,还是只是为一切做好准备?视图可以帮助吗? (测试它!)。一般规则:不为解决方案产生问题,不解决不存在的问题。解决现有问题。如果这是其中之一,示例查询、执行计划、索引结构可以帮助我们说一些有用的东西。现在这是一个理论问题
猜你喜欢
  • 2012-12-15
  • 2016-06-19
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多