【发布时间】:2020-03-12 14:26:43
【问题描述】:
我正在寻找一种方法来对 4 个表进行建模,以保持它们的一致性。其中 2 个表是一种“枚举 ++”类型:它们描述了可能的情况。另外两个都是“类型”表的具体化。一个简单的例子:):
ActionType:描述可能的“动作”类型,例如切蔬菜,做饭,...
name
ActionTypeResult:描述每个Type的动作结果
name-
type(Type.name)
因此,例如,cutting vegables 的结果将是有机废物和可烹饪的蔬菜块(所以 2 个结果)。 boiling 也会有 2 个结果:熟食和沸水(你通常会摆脱沸水,但这是该步骤的结果)。
现在,我要描述一个配方,这意味着它有多个ActionTypes,但ActionType 的Result 是下一个的输入。所以:
我可能有一个Recipe 实体,它包含
CookingSteps,链接到ActionType - 知道它是哪种步骤,以及该步骤具有哪种Results。
CookingFlows,这是Results(产品),可以作为下一个CookingStep的输入。
所以,可以这样做:
Recipe:
name
CookingStep:
-
recipe(Recipe.name) -
title(嗯,你可以给这些步骤命名,取决于配方:))
CookingFlow:
-
step(CookingStep.title,这是流量的来源) -
recipe(Recipe.name,不确定我们是否真的需要它,因为我们知道它是因为它已经由step链接,我没有包括在下图中) -
result(ActionTypeResult.name,所以知道我们在谈论哪些不同的流程) -
flows to(CookingStep.title,所以我们知道它的流向)。
现在,这样做,我在 recipe 关系中看到了冗余,但也有可能“作弊”:cut vegables 类型的 CookingStep 可以与具有 @ 的 CookingFlow 建立关系987654363@boiling water 或boiled food。我希望禁止这种作弊行为。
问题是:如何正确建模?
问题在于它可能导致数据不一致(作弊)。我遇到的主要问题是:有一定的 CookingStep,我既有 ActionType 又有 CookingFlow。这可以。但是,在这种情况下,我在 CookingFlow 中的 ActionTypeResult 必须是 CookingStep 定义的 ActionType 允许的。我希望在同一 CookingStep 的 CookingFlow 上强制执行正确的 ActionType。我可以使用数据库上的触发器来检查这是否正确;我主要想知道是否可以在没有触发器的情况下对其进行建模。
【问题讨论】:
-
您的问题到底是什么?--正确建模什么?问题是什么?什么是“配方关系中的冗余”?为什么不好?什么“看起来不对”?什么是正确的”?使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。 PS 将单词放在吓人的引号中并不能阐明您没有通过实际说出您的意思来阐明的特殊含义。 (对于“作弊”,你举了一个例子,但不要说它是什么例子。)
-
请通过编辑而非 cmets 进行澄清。 PS你还是不清楚。术语“'enum++'类型”来自哪里?为什么引号?究竟是什么“种类”?您仍然在给出示例而没有明确说明它们是什么示例。什么是“具体化”——不清楚。引号中的“作弊”——未定义——后跟一个例子——究竟是什么? “基本上”或“基本上”或“换句话说”等没有引入或总结您也给出的清晰、准确和完整的描述,只是意味着“不清楚”。 “所以,例如”——一个什么例子?什么是“
-
通过编写简明的用户手册来清楚地使用这个数据库。在给出业务关系(船舶)/关联或表(基础或查询结果)时,说明其中的一行根据其列值说明了业务情况。 PS有很多图表样式。给出一个图例或参考。但是:use text, not images/links, for text--including tables & ERDs。将图像用于无法表达为文本或增强文本的内容。 PS重新询问:询问您在教科书/参考资料之后的第一个问题,并给出需要询问的内容。
-
感谢您的回答,但似乎我无法清楚地表达它,也无法用图像或文字表达。它不仅仅是关于子类型/继承/多态性。我知道这些是如何工作的。这是可以在教科书中找到的东西,所以我不需要回答这个问题:)。我不是在谈论这里的表,或者 SQL,或者......它是关于一个信息模型。我还不关心 FK 和 PK。那是实现细节。在决定要使用的技术之前,我首先希望得到正确的模型。但又一次,我似乎无法很好地表达自己。不过,感谢您的尝试。
标签: database-design relational-database relationship erd