mysql:具有额外参数的多对多数相关数据的模式

时间:2014-11-18 05:20:42

标签: mysql many-to-many relational-database

您好我有两个模型,一个是Composition,一个是SaltsEvery composition is the combination of one or more salts,现在还有另一个术语数量,它将两个成分区分为相同的盐即

如果 x成分含有2种盐A(250 mg)和B(350 mg)

y组合物也含有相同的盐A(350 mg)和B(500 mg)

所以我的问题是在哪个表格中数量必须存储我可以制作多对多的表格,仅与相关的成分和salt id,

此外,我希望所有的构图都应该唯一,那么我应该在验证中遵循哪种方法?

1 个答案:

答案 0 :(得分:0)

您似乎对表单的陈述感兴趣:

-- [c] is a composition number
composition(c)
-- [s] names a salt
salt(s)
-- composition [c] uses salt [s] in quantity [300] mg
composition_salt_quantity(c,s,q)

设计基于填空的声明,您可以使用它来描述您的应用程序设置。每个谓词都有一个表。该表通过为命名空白提供值来保存创建true语句的行。例如,在表格中具有(7,' NaCl',300)_salt_quantity状态"组合物17使用盐' NaCl'数量300毫克"并且将其排除在状态之外"组合物17不使用盐和NaCl和#39;数量300毫克"。您必须决定您想要的谓词。以上是基于您(不清楚)(原始)的问题。以下检查变化并给出约束。 (在你的(不清楚的)编辑过的问题中,它可能是你想要的"作文[c]在单位[u]"的数量[300]中使用盐[s]。)

如果一种成分使用盐,那么只有一种。所以(c,s)在composition_salt_quantity中是唯一的。如果盐可以由多种组合物使用,那么(s)不是唯一的。如果组合物可以使用多种盐,那么(s)不是唯一的。所以(c,s)是候选键。所以声明(c,s)UNIQUE NOT NULL。你必须告诉我,但几乎可以肯定没有其他一组列是独一无二的。所以(c,s)是唯一的候选键。您可以改为声明一个候选键PRIMARY KEY。这里只有一个。

问题:你需要

-- composition c has salt s
composition_salt(c,s)

如果你想记录组合物c使用盐而不提及数量,那么你需要composition_salt。使用与上述相同的推理,无论(c,s)是否为候选键,因此UNIQUE NOT NULL或PRIMARY KEY。然后因为composition_salt_quantity中的(c,s)将在compositon_salt中,所以会有一个composition_salt_quantity FOREIGN KEY REFERENCES compositon_salt(c,s)。

但是如果你想在记录组合物时使用盐来记录数量,那么你就不需要使用composition_salt。因为:对于其中的每一行(c,s),你必须在composition_salt_quantity中有一行(c,s,q),说明组合c的数量为q的盐。并且对于不在其中的每一行,组合物c具有盐的假是错误的,因此对于某些q组合物c具有数量为q的盐,因此在composition_salt_quantity中没有行。那个c和s。所以a(c,s)在compositon_salt中,当且仅当它在composition_salt_quantity中时。所以不需要composition_salt。 (它的值总是select c,s from composition_salt_quantity。)

同样:只有当你想要录制合成而不将其录制到另一个表中时,你才需要合成(c)。约束是composition_salt_quantity(c)是FOREIGN KEY REFERENCES组合(c)。 (如果你有,也与composition_salt相同。)只有当你想要记录盐而不将其记录在另一个表中时,你才需要盐。约束是composition_salt_quantity(s)是外来密钥参考盐(S)。 (如果你有,则与composition_salt相同。)你说"每种成分都是一种或多种盐的组合"但目前尚不清楚你的意思是在申请情况下还是在表格中。

(实际上你应该决定是否需要(c,q),(s,q)和/或(q)上的表。如果你有任何一对双列表,那么决定是否会使composition_salt_quantity变得不必要如果你有三个,那么一个是不必要的。)