我正在尝试提出关系模型和数据库实现,但仍然遇到这个问题。但我甚至不知道该怎么称呼它!我们将不胜感激。
我试图将问题归结为基础。
简化示例:
这是MySQLWorkbench图:
正如您所看到的,所有问题都在Atom
表格。
预期目标概要:
我不确定:
Atom
表 - 似乎Atom_ref
和Residue
之间的连接会产生蛋白质的所有原子 - 但我还需要存储数据关于原子问题大纲:
到目前为止我尝试过:
Atom_ref
的pk添加到Atom
的pk中 - 但是,residual_ref可能与Residue
的Residue.rr_name
更改为部分pk - 违反域语义我知道这是对这个问题的一个不好的解释,我想弄清楚如何更清楚地解释它!欢迎提出改进建议!
答案 0 :(得分:3)
如果我理解正确,那么你所追求的是(a)Atom和Residue的连接以及(b)Atom_ref之间的包含依赖性。 (即Atom中的所有原子名称,与残留中为其定义的rr_name组合,必须声明为有效组合,即必须出现在Atomref中)。
仅使用RI / FK的方法是在Atom中冗余地包含rr_name。将FK从Atom扩展到Residue到所有三列。这将保证您在Atom中记录的rr_names与Residue中的信息保持一致。但是既然你现在已经在Atom中引入了rr_name,那么你现在可以确保(通过从Atom到Atom_ref的FK atomname + rrname)在Atom中记录的任何内容,也与已声明的原子名一致(在atomref中)存在所涉及的残留物。
请注意,此“解决方案”会使您的数据库更新更难(维护更多冗余,从而导致更多违规行为),因为您刚刚降低了设计的NF级别。
另一种方法是按原样保留您的设计,并通过适当的触发器对每个涉及的表执行约束,其中更新可能会导致违反您的业务规则。那就是,删除和更新Atom_ref(即任何导致某个地方有效存在的有效组合消失的东西),Residue上的(rr_name)更新,以及Atom上的插入和更新(即任何可能导致某些外观出现的内容)可能无效的组合。)
答案 1 :(得分:1)
在蛋白质中,残基名称是否独特?你可以在Residue (p_id, rr_name)
上创建一个独特的约束吗?
如果是,那么在Atom
中,您可以将r_index
替换为rr_name
;在(p_id,rr_name)
到Residue
创建FK;并在(rr_name, atom_name)
到Atom_ref
创建一个FK。
编辑:是的,我认为它可能不那么简单。我认为你的第二个要点是正确的方向 - 但不要改变Residue
的PK,只需在所有三列上创建一个新的唯一约束。这两个约束甚至可以共享一个索引。然后,您可以将rr_name
添加到Atom
,并为Residue
添加三列FK,将{FK}列为Atom_ref
。
答案 2 :(得分:0)
atom和atom_ref有什么区别?查看表结构,似乎Residue_ref和Atom_ref表示Atoms和Residues之间的多对多关系。 (对不起,我从未接过生物化学,所以我可能会遗漏一些重要的事情。)
在特定残留物的上下文中是否有特定于Atom的数据?如果答案是否定的,我会将Residue_ref和Atom_ref表减少到一个表:atoms_residues,如下所示:
atoms_residue(r_index, atom_index)
这将确保原子表中的特定原子与残留表相关。
如果有原子 - 残基配对的上下文信息,我仍然会创建上表,并考虑将上下文信息作为列添加到该表中。
关键是封装。特定于原子的数据应该在atom表中。残留物特定数据应位于残留物表中。连接表表示两者之间的多对多关系,并且还可以选择包含该关系唯一的任何信息。