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

标签 mysql many-to-many relational-database

嗨,我有两个模型,一个是组合物,一个是每个组合物都是一种或多种盐的组合,现在有是另一个术语数量,它区分具有相同盐的两种成分,即

如果x组合物含有2种盐A(250毫克)和B(350毫克)

y组合物还具有相同的盐A(350毫克)和B(500毫克)

所以我的问题是数量必须存储在哪个表中我可以制作一个多对多表来仅关联成分和盐ID,

此外,我希望所有组合都应该唯一,那么我应该在验证中遵循什么方法?

最佳答案

您似乎有兴趣做出以下形式的陈述:

-- [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)

设计基于填空语句,您可以用它来描述您的申请情况。每个谓词都有一个表。该表保存通过为命名空白给出值来做出正确陈述的行。例如,这里表composition_salt_quantity中的(7,'NaCl',300)表示“组合物17使用盐'NaCl'的量为300mg”,并且省略它表示“组合物17使用盐'NaCl'的量不是这样的情况” 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 使用 salt 而不提及数量,那么你需要compose_salt。使用与上面相同的推理来判断 (c,s) 是否是候选键以及 UNIQUE NOT NULL 或 PRIMARY KEY。然后,因为composition_salt_quantity中的(c,s)将在compositon_salt中,所以将有一个composition_salt_quantity外键引用compositon_salt (c,s)。

但是,如果您希望在记录组合物 c 使用盐 s 时始终记录数量,那么您不需要合成盐。因为:对于其中的每一行 (c,s),composition_salt_quantity 中必须有一行 (c,s,q),说明组合 c 的盐 s 的数量为 q。对于不在其中的每一行,组合 c 具有盐 s 是错误的,因此对于某些 q 组合 c 具有数量 q 的盐 s 是错误的,因此在composition_salt_quantity 中没有包含该 c 和 s 的行。因此,当且仅当 a (c,s) 位于compositon_salt 中时,它位于compositon_salt_quantity 中。所以不需要composition_salt。 (它的值始终是从composition_salt_quantity中选择c,s。)

类似地:只有当您想记录一个组合而不将其记录在另一个表中时,才需要组合(c)。约束是composition_salt_quantity (c) 是FOREIGN KEY REFERENCES 组合(c)。 (如果有,则与composition_salt相同。)仅当您想记录盐而不将其记录在另一个表中时,才需要盐。约束是composition_salt_quantity (s) 是FOREIGN KEY REFERENCES salt (S)。 (如果您有,则与composition_salt相同。)您说“每种组合物都是一种或多种盐的组合”,但不清楚您的意思是在应用情况中还是在表格中。

(您实际上应该决定是否需要 (c,q)、(s,q) 和/或 (q) 上的表。如果您有任何一对两列表,则确定这是否会使合成盐量变得不必要.如果你有三个,是否有一个是不必要的。)

关于mysql:带有额外参数的多对多相关数据的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26987120/

相关文章:

php - 帮助父类(super class)型/子类型? (和类别..)

Mysql2::Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock'

relational-database - 错误 OneTOMany/ManyToOne 映射 : null at time of saving parent - child table

MySQL 计算最大组数

mysql - 如何在 mysql 中设置本地列表/元组变量

c# - 跳过导航没有定义外键

postgresql - Go GORM many2many问题

java - 如何使用复合键映射多对多

php - 简单关系型数据库——高效查询

ruby-on-rails - 为什么 Rails 数据库 ID 在销毁中间项后继续向前计数?