2011-10-28 63 views
2

我试图想出一个关系模型和数据库实现,但仍然遇到这个问题。但我甚至不知道该怎么称呼它!对于改进标题的建议将不胜感激。实现关系数据模型:此表的约束是什么?

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


简单的例子:

这里的MySQLWorkbench图:

MySQLWorkbench data model


正如你所看到的,的问题都与Atom

概要的期望的目标:

  • 我需要存储用于蛋白质
  • 我可以具有数据的一些原子的,或没有原子
  • 我不中的特定原子数据我不希望能够插入垃圾数据 - 我想要数据库的限制,以防止这种情况

什么我不确定:

  • 是否应该有一个Atom表 - 它看起来像Atom_refResidue之间的连接会产生蛋白质的所有原子 - 但我也需要将数据存储有关原子

概要的问题:

  • 每个原子需要一个残基,以及atom_ref
  • 但因为残余物与residue_ref相关的atom_ref只能是相关的一个(与residue_ref)atom_ref的
  • 不知道如何将残留的residue_ref与atom_ref的residue_ref匹配

我“已经到目前为止已经试过:

  • Atom_ref的PK增加的Atom的PK - 但随后的residue_ref可能不匹配Residue
  • 变化Residue.rr_name到PK的一部分 - 违反了域语义

我知道这是一个问题的解释很差,我想弄清楚如何更清楚地解释了!改进建议比欢迎!

+0

这里的主要问题是能够在简单的句子,这个问题域来解释。真的,这就是它。所以开始像:'残留是...'; '蛋白质含有...'; '残留类型是..'。等等。例如你的句子:* ...每个原子需要一个残基... *这是正确的吗?原子是否需要残留物? –

+0

@DamirSudarevic - 你是对的,我努力试图完整而准确地解释这一点,我相信我失败了。任何改善问题的建议,将不胜感激。 –

+0

@MattFenwick:尝试用简单的术语来解释你的模型(忘记'_ref'或其他可能掩盖他人的东西)。你会如何向小孩解释这一点?蛋白质可以有许多残基,残基属于一种蛋白质。对?一个残基可以有许多原子,一个原子属于一个残基。对? (这就是3个表格:Protein,Residue,Atom所描述的)。那里还有什么? –

回答

3

如果我正确地理解了你,那么你所追求的是(a)Atom和Residue的连接,和(b)Atom_ref之间的包含依赖关系。 (即Atom中的所有原子名称,与为残差定义的rr_name组合,必须声明为有效组合,即必须出现在Atomref中)。

仅使用RI/FK来完成此操作的方法是将rr_name冗余地包含在Atom中。将FK从Atom扩展到Residue全部三列。这将保证您记录在Atom中的rr_name与Residue中的信息保持一致。但是现在你已经在Atom中引入了rr_name,现在你有办法确保(通过从Atom到Atom_ref的FK atomname + rrname)Atom中记录的任何内容也与已声明的atomname一致(In atomref)为所涉及的渣油参考而存在。

请注意,由于您刚刚降低了设计的NF级别,因此此“解决方案”会使您的数据库更新变得更加困难(需要更多的冗余来维护,从而导致违规的可能性更大)。

另一种方法是按原样保留设计,并在每个涉及的表上更新可能导致违反业务规则的情况下,通过适当的触发器强制执行约束。这就是说,删除和更新Atom_ref(即导致某个有效组合消失的任何东西),更新(rr_name)Residue,并在Atom上插入和更新(即任何可能导致某些可能无效的组合)。

+0

我给一个尝试,看看它是如何工作的。谢谢。 –

+0

另一种可能的方法是:撤销基表的写权限,并提供存储的过程来实现CRUD操作,同时保持完整性。此代码可以按照所需顺序定位到表的更新;触发器中的等价代码必须在所有方向上进行更新(如果你明白我的意思),我觉得难以编写。 – onedaywhen

+0

正确。我只是在考虑强制约束。在冗余rr_name的设计中,他可能需要将他的FK级联进行任何更新,如果他使用触发器,他可能需要编写它们,以便达到与第一个场景的级联更新相同的效果(而不是直截了当地拒绝更新)。但是,我计算了5个触发器来执行。你的SPROC方法不是给你3个表* 3个更新类型= 9个模块来实现(以及测试和部署,维护和...)吗? –

1

在蛋白质中,残基名是否是唯一的? I.E.,你可以在Residue (p_id, rr_name)上创建一个唯一的约束吗?

如果是这样,那么在Atom中,您可以用rr_name代替r_index;在(p_id,rr_name)Residue之间创建一个FK;并在(rr_name, atom_name)Atom_ref之间创建一个FK。

编辑:是的,我想这可能不会那么简单。我认为你的第二个要点是正确的方向 - 但不要改变Residue的PK,只需在所有三列上创建一个新的唯一约束。这两个限制甚至可以共享一个索引。然后你可以加rr_nameAtom,并给它一个三列FK到Residue和一个两列FK到Atom_ref

+0

不,不幸的是;每种蛋白质中都有很多相同的'rr_name'。 –

+0

因此,我可以包含一个非PK列作为外键在不同的表中的一部分? –

+0

我不知道MySQL的,但在甲骨文的外键可以引用PK或唯一约束 –

0

atom与atom_ref有什么区别?看看你的表结构,看起来好像Residue_ref和Atom_ref要表达Atoms和Residues之间的多对多关系。 (对不起,我从来没有拿过生物化学,所以我可能会错过重要的东西)。

是否存在特定于残留特定于Atom的数据?如果答案是否定的,我会减少Residue_ref和Atom_ref表到单个表:atoms_residues看起来像这样:

atoms_residue(r_index, atom_index) 

这将确保从原子表中的特定原子出现在相对于残留表。

如果存在原子 - 残基配对的上下文信息,我仍然会创建上述表并考虑将上下文信息作为列添加到该表中。

关键是封装。原子特定的数据应该在原子表中。残渣特定数据应该在残留物表中。连接表表达了两者之间的许多关系,并且可以选择性地包含该关系唯一的信息。

+0

不,不幸的是,我不认为这会奏效。我对除Atom以外的所有表格都非常有信心。 –

+0

这两个_ref表的用途是什么?您提供的唯一两列是身份特定的。 –

+0

试图保持简单(可能失败)。基本上,ref表格是不变的 - 它们列出了所有的残基类型,以及每个残基中包含的原子。然后一个蛋白质由100个残基组成(每个残基中有一个类型,这个类型决定了它的原子)。 –

相关问题