[英]Implementing a relational data model: what are the constraints for this table?
我正在尝试提出一个关系模型和数据库实现,但是一直遇到这个问题。 但是我什至不知道该怎么称呼! 改进标题的建议将不胜感激。
我试图将问题归结为基本问题。
简化示例:
这是MySQLWorkbench图:
如您所见, 问题全部出在Atom
table上 。
预期目标概述:
我不确定的是:
Atom
表-似乎Atom_ref
和Residue
之间的连接会生成蛋白质的所有原子-但我还需要存储有关原子的数据 问题概述:
到目前为止,我已经尝试过:
Atom_ref
的pk添加到Atom
的pk中-但那时Residue
_ref可能与Residue
不匹配 Residue.rr_name
更改为pk的一部分-违反域语义 我知道这是对该问题的不好解释,我正在尝试找出如何更清楚地解释它! 非常欢迎提出改进建议!
如果我理解正确,那么您所追求的是(a)Atom和Residue的连接与(b)Atom_ref之间的包含依赖关系。 (即,必须将Atom中的所有原子名与在残基中为其定义的rr_name组合为有效组合,即必须出现在Atomref中)。
仅使用RI / FK的方法是在Atom中冗余地包含rr_name。 将FK从Atom扩展到Residue到所有三列。 这将确保您确保Atom中记录的rr_name与Residue中的信息保持一致。 但是,由于您现在已经在Atom中引入了rr_name,因此,您现在具有(通过FK原子名+从Atom到Atom_ref的rrname)确保Atom中记录的任何内容也与已声明的原子名相一致的方式(在atomref中)存在于所涉及的剩余引用中。
请注意,由于您刚刚降低了设计的NF级别,因此此“解决方案”使数据库更新变得更加困难(需要更多的冗余维护,从而有更多的违规可能性)。
这样做的另一种方法是保持设计不变,并通过对每个涉及的表进行适当的触发器来强制执行约束,在此情况下更新可能会导致违反业务规则。 也就是说,删除和更新Atom_ref(即导致有效组合消失的任何内容,该组合有效地存在于某处),更新(rr_name)在Residue上,并插入和更新Atom(即可能导致某些外观出现的任何内容)可能无效的组合)。
在蛋白质中,残基名称是否唯一? IE,您可以在Residue (p_id, rr_name)
上创建唯一约束吗?
如果是这样,那么在Atom
你可以取代r_index
与rr_name
; 在(p_id,rr_name)
为Residue
创建FK; 和创建上的FK (rr_name, atom_name)
到Atom_ref
。
编辑 :是的,我认为可能不会那么简单。 我认为您的第二个要点是正确的方向-但不要更改Residue
的PK,只需在所有三列上创建一个新的唯一约束即可。 这两个约束甚至可以共享一个索引。 然后,您可以将rr_name
添加到Atom
,并将其三列FK赋予Residue
,将其两列FK赋予Atom_ref
。
atom和atom_ref有什么区别? 查看您的表结构,似乎Residue_ref和Atom_ref将表示原子和残基之间的多对多关系。 (对不起,我从未参加过生化疗法,所以我可能缺少一些重要的东西)。
在特定残基的上下文中是否存在特定于Atom的数据? 如果答案是否定的,我会将Residue_ref和Atom_ref表缩减为一个表:atoms_residues,如下所示:
atoms_residue(r_index, atom_index)
这将确保原子表中的特定原子相对于残基表出现。
如果存在原子残基配对的上下文信息,我仍将创建上面的表,并考虑将上下文信息作为列添加到该表中。
关键是封装。 原子特定的数据应该在原子表中。 特定于残基的数据应在“残基”表中。 联接表表示两者之间的多对多关系,并且可以选择包含该关系唯一的任何信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.