实现关系数据模型:该表的约束是什么?

时间:2011-10-28 17:45:57

标签: sql database database-design data-modeling

我正在尝试提出关系模型和数据库实现,但仍然遇到这个问题。但我甚至不知道该怎么称呼它!我们将不胜感激。

我试图将问题归结为基础。


简化示例:

这是MySQLWorkbench图:

MySQLWorkbench data model


正如您所看到的,所有问题都在Atom表格

预期目标概要:

  • 我需要存储特定蛋白质原子的数据
  • 我可能有一些原子的数据,或者没有原子的数据
  • 我不希望能够插入垃圾数据 - 我希望数据库约束能够阻止这种情况

我不确定:

  • 是否应该有一个Atom表 - 似乎Atom_refResidue之间的连接会产生蛋白质的所有原子 - 但我还需要存储数据关于原子

问题大纲:

  • 每个原子需要一个残基和一个atom_ref
  • 但由于残基与residue_ref相关联,因此atom_ref只能是关联的一个(与residue_ref一起)atom_ref的
  • 不知道如何将Residue的residue_ref与atom_ref的residue_ref匹配

到目前为止我尝试过:

  • Atom_ref的pk添加到Atom的pk中 - 但是,residual_ref可能与Residue
  • 不匹配
  • Residue.rr_name更改为部分pk - 违反域语义

我知道这是对这个问题的一个不好的解释,我想弄清楚如何更清楚地解释它!欢迎提出改进建议!

3 个答案:

答案 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表中。残留物特定数据应位于残留物表中。连接表表示两者之间的多对多关系,并且还可以选择包含该关系唯一的任何信息。