Database design 添加(或不添加)FK以简化选择

Database design 添加(或不添加)FK以简化选择,database-design,foreign-key-relationship,Database Design,Foreign Key Relationship,我正在开发一个Android应用程序和JSON web服务。Android应用程序将使用这些web服务 此外,我将在两侧都有一个数据库,服务器端和客户端将具有相同的数据库模式 我将解释我正在尝试做什么: 用户创建一个或多个电子报表 每个EReport都有一个QAPQAP表格将是 服务器端数据库 每个QAP都有一个或多个缺陷缺陷将是一份副本 服务器端数据库的设计 如果用户需要,可以定义缺陷。要做到这一点,我必须 添加了EReportDefect表格 缺陷可能有一张或多张照片。我创造 ERepor

我正在开发一个Android应用程序和JSON web服务。Android应用程序将使用这些web服务

此外,我将在两侧都有一个数据库,服务器端和客户端将具有相同的数据库模式

我将解释我正在尝试做什么:

  • 用户创建一个或多个电子报表
  • 每个EReport都有一个QAPQAP表格将是 服务器端数据库
  • 每个QAP都有一个或多个缺陷缺陷将是一份副本 服务器端数据库的设计
  • 如果用户需要,可以定义缺陷。要做到这一点,我必须 添加了EReportDefect表格
  • 缺陷可能有一张或多张照片。我创造 EReportDefImg存储EReport、EReportDefect和一个或多个图像之间的关系
我的问题是:我是否需要EReportDefImg上的eReportId作为FK

我添加了这个专栏,因为我可以使用它来查找EReport的所有缺陷图像


人类的逻辑是,如果有报告缺陷,就必须有报告。所以使用FK。我想这可能会对你以后有所帮助

我需要在EReportDefImg上报告为FK吗

没有

EReportDefImg.eReportId
将允许
EReportDefImg
行引用
EReportDefect
行,从而
EReportDefImg.eReportId
不同于
EReportDefImg.eReportId

我添加了这个专栏,因为我可以使用它来查找EReport的所有缺陷图像

您仍然可以通过加入
ereportdefing
ereportdefing
来获得
ereportdefing.eReportId
,来实现这一点(无需
ereportdefing.eReportId

如果要避免加入,可以使用标识关系将
EReportDefect
的PK中包含
eReportId
,然后也将其迁移到
ereportdefing.eReportId
(然后可以直接使用它进行过滤,而无需加入)。缺陷ID同上

注意:我添加了
eReportDefectNo
以允许对
EReport
Defect
的相同组合使用多个
EReportDefect
s。如果不需要,请删除
eReportDefectNo



顺便说一句,现在的模型允许一个
EReportDefect
连接到两个不同的
QAP
s(一个通过
EReport
另一个通过
Defect
)。这是故意的吗?

不,您不需要,执行这种设计通常是出于性能原因-忽略不必要的连接。如果你没有这样的问题,那就不要这样做

顺便说一下,您似乎在主键中放入了太多的外键。这样做是为了帮助保持数据的一致性,但由于性能下降,这通常不是一个好的做法


顺便说一句,EReportDefect中的defectId外键用于什么?

很抱歉,我犯了一个严重的错误。我的问题是:我需要在EReportDefImg上以FK的形式报告吗?对不起。啊,好吧,我的回答是:不;)用两种不同的QAP?不,这不是故意的。缺陷只能属于QAP。@VansFannel然后您还需要在模型的更高级别使用标识关系,如所解释的。我已经阅读了您的建议,但我什么都不懂(可能是因为我的英语水平)。如何避免设计中的“问题”?谢谢。@VansFannel好吧,试着想象一下,如果你试图在钻石底部插入,会发生什么。在不确定关系的情况下,钻石的两面可以指向他们喜欢的任何东西,包括不同的顶部。通过识别关系,顶部PK传播到最底部,因此双方都必须匹配它(以免违反从一侧到底部的FK),这样他们就不能在顶部的选择上有所不同。好的,所以我需要将qapId传播到每个表,不是吗?
EReportDefect.defectId
id FK到
Defect
表。它将包含null,因为
EReportDefect
可以包含用户定义的
Detect
。这个问题是相关的。