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