2 个额外的表是否比一个带有 meta 的表更好?
Does 2 additional tables better than one with meta?
有一个关于架构的问题:我有 2 个科目,DocumentLetter
和 DocumentOther
,都应该得到经理的批准。
更好的方法是:使用 2 个额外的模型 DocumentLetterApprove
和 DocumentOtherApprove
与实体关系,或者一个额外的 table 没有关系但包含关于模型身份的信息(列 ModelName 和型号 ID)?
或者另一个例子,不同文档的附件。
信件、合同 - 2 个不同的 table,每个都应该有自己的附件。
我可以为每个模型(用于信件和合同)使用额外的 table 或创建一个 table 字段字段 ModelName 和 ModelID?
就我个人而言,如果相关实体(批准)可能因应用对象不同而有任何不同,我倾向于保留单独的实体/w 关系。我避免模棱两可地 linked tables 除非它们代表可能与许多其他实体之一关联的大型 1 对多实体。
使用 "ParentType" + "ParentId" 之类的问题是您无法在相关 table 之间利用任何形式的 FK 约束。这也意味着您无法利用 EF 关系,因为有时可能会加载一个文档并想知道它是否已获得批准以及批准的详细信息。
如果预期不同文档类型的 Approval 相同,那么我会尽快声明一个通用 Approval table/Entity 并在每个文档类型 table 上放置一个 ApprovalId 以建立一个从文档到批准的多对一关系。
如果一个approval是相同的,可以形成多对多,那么一个suitable多对多的关系tableDocumentLetter - DocumentLetterApproval (FKs) - Approval (Approval details)可以就业。
如果信件批准与其他批准可能不同,则:DocumentLetter - DocumentLetterApproval(批准详细信息)
像这样的设计决策通常来自对 DRY(不要重复自己)的考虑。我能给出的建议是 KISS(保持简单)应该胜过 DRY,并且 DRY 应该只适用于被证明是相同的 logic/structure。 (不仅仅是期望相同,或者更糟的是,期望相似)DRY 应该是持续改进的重构考虑因素,而不是前期设计决策。过早地为 DRY 编码最终会在你把自己逼到角落时浪费你的时间。通过保持代码的流畅性,可以证明这些关系,然后如果证明它们是相同的,则将其重构为单个实体。时间仍然花在重构上,但重构是为了使代码结构更好,而不是在必须绕过设计假设时使代码更糟。
一个我可能认为不明确的例子 linked linked table 类似于文件附件。我可能有多个实体可以保存对 1 个或多个附件的引用。附件不是我经常需要 link 的东西,而是通过一个明确的操作,我可以触发一个额外的查询,因为我不打算在加载文档时预加载附件详细信息。在这种情况下,附件 table 可能有 ParentType 和 ParentId 索引,以便我可以快速获取特定文档或其他实体的详细信息。我永远不会尝试做 Context.Documents.Include(x => x.Attachments)
之类的事情,不会有这样的参考可用。附件将始终由单个文档访问,因此我会求助于 Context.Attachments.Where(x => x.ParentType == ParentTypes.DocumentLetter && x.ParentId == documenLetterId).ToList();
我曾在 单独 设计的系统上工作过,这些系统具有模棱两可的 linked table 类型。它们不仅在扩展到任何合理规模时极其缓慢,而且随着系统的发展和关系性质的变化,它们也极易出错。记录往往与预期规则不同步。
有一个关于架构的问题:我有 2 个科目,DocumentLetter
和 DocumentOther
,都应该得到经理的批准。
更好的方法是:使用 2 个额外的模型 DocumentLetterApprove
和 DocumentOtherApprove
与实体关系,或者一个额外的 table 没有关系但包含关于模型身份的信息(列 ModelName 和型号 ID)?
或者另一个例子,不同文档的附件。
信件、合同 - 2 个不同的 table,每个都应该有自己的附件。
我可以为每个模型(用于信件和合同)使用额外的 table 或创建一个 table 字段字段 ModelName 和 ModelID?
就我个人而言,如果相关实体(批准)可能因应用对象不同而有任何不同,我倾向于保留单独的实体/w 关系。我避免模棱两可地 linked tables 除非它们代表可能与许多其他实体之一关联的大型 1 对多实体。
使用 "ParentType" + "ParentId" 之类的问题是您无法在相关 table 之间利用任何形式的 FK 约束。这也意味着您无法利用 EF 关系,因为有时可能会加载一个文档并想知道它是否已获得批准以及批准的详细信息。
如果预期不同文档类型的 Approval 相同,那么我会尽快声明一个通用 Approval table/Entity 并在每个文档类型 table 上放置一个 ApprovalId 以建立一个从文档到批准的多对一关系。
如果一个approval是相同的,可以形成多对多,那么一个suitable多对多的关系tableDocumentLetter - DocumentLetterApproval (FKs) - Approval (Approval details)可以就业。
如果信件批准与其他批准可能不同,则:DocumentLetter - DocumentLetterApproval(批准详细信息)
像这样的设计决策通常来自对 DRY(不要重复自己)的考虑。我能给出的建议是 KISS(保持简单)应该胜过 DRY,并且 DRY 应该只适用于被证明是相同的 logic/structure。 (不仅仅是期望相同,或者更糟的是,期望相似)DRY 应该是持续改进的重构考虑因素,而不是前期设计决策。过早地为 DRY 编码最终会在你把自己逼到角落时浪费你的时间。通过保持代码的流畅性,可以证明这些关系,然后如果证明它们是相同的,则将其重构为单个实体。时间仍然花在重构上,但重构是为了使代码结构更好,而不是在必须绕过设计假设时使代码更糟。
一个我可能认为不明确的例子 linked linked table 类似于文件附件。我可能有多个实体可以保存对 1 个或多个附件的引用。附件不是我经常需要 link 的东西,而是通过一个明确的操作,我可以触发一个额外的查询,因为我不打算在加载文档时预加载附件详细信息。在这种情况下,附件 table 可能有 ParentType 和 ParentId 索引,以便我可以快速获取特定文档或其他实体的详细信息。我永远不会尝试做 Context.Documents.Include(x => x.Attachments)
之类的事情,不会有这样的参考可用。附件将始终由单个文档访问,因此我会求助于 Context.Attachments.Where(x => x.ParentType == ParentTypes.DocumentLetter && x.ParentId == documenLetterId).ToList();
我曾在 单独 设计的系统上工作过,这些系统具有模棱两可的 linked table 类型。它们不仅在扩展到任何合理规模时极其缓慢,而且随着系统的发展和关系性质的变化,它们也极易出错。记录往往与预期规则不同步。