MySQL / InnoDB - 循环外键约束

时间:2013-09-02 00:39:36

标签: mysql key constraints

{与我一小时前提出的问题完全不同的问题}

使用MySQL,从MyISAM转移到InnoDB表。数据库设计始于转储数据并在没有外键或约束的情况下重新导入数据。一次添加一个以查找错误。

处理ParentTableChildTable的正确方法是什么,其中ParentTableChildTable之间存在一对多的关系,并且从ParentTableChildTable的一对一关系?

ParentTable有多个ChildTable选项,并且当前选择的ChildTable选项时,可能会发生这种情况。

我的情况是有多张照片的东西,我希望记录所有这些照片,以及我觉得最好的照片。 (分辨率,清晰度,颜色准确性。)对于我的情况,概念上不是ParentTable,直到ChildTable,反之亦然。

在我目前的MyISAM设计中,ParentTableIDChildTable来创建最佳选择的一对一关系,ChildTableIDParentTable来创建一个所有可用选择的多对多关系。首次创建时,会创建ParentTable,然后创建ChildTable,然后使用ParentTable更新IDChildTable

如果我添加外键约束,我无法同时创建新记录。

我能想到的只有:

  • 在这种情况下没有约束
  • 删除一对一关系,并在Best中设置ChildTable布尔值,这会引入多个Best中出现零个或多个ChildTable选项的不良可能性单个ParentTable
  • 的条目
  • 我可以允许一个或两个外键ID为空。现在他们不是空的。不喜欢这个想法,因为我只希望null对两个插入片段之间的秒数有效。
  • 等待MySQL / InnoDB允许在事务中推迟外键约束检查,直到提交为止。 MySQL 5.6不支持这一点,不知道是否有计划。
  • 在两次插入之前,禁用外键检查。不喜欢这样,因为不应该周期性地绕过它的一致性错觉。当然,这至少使更新保持一致。

不要喜欢这些选择。想法?

修改

CREATE TABLE `ParentTable` (
  `IDParentTable` bigint(20) unsigned NOT NULL auto_increment,
  `IDChildTableBest` bigint(20) unsigned NOT NULL default '0',
  PRIMARY KEY (`IDParentTable`),
  KEY `ParentTable_IDChildTableBest` (`IDChildTableBest`),
  ) ENGINE=InnoDB DEFAULT CHARSET=latin1
---Would like to also have, but can't do both of these---
CONSTRAINT `ParentTable_IDChildTableBest` FOREIGN KEY (`IDChildTableBest`) REFERENCES `ChildTable` (`IDChildTable`)

CREATE TABLE `ChildTable` (
  `IDChildTable` bigint(20) unsigned NOT NULL auto_increment,
  `IDParentTable` bigint(20) unsigned NOT NULL default '0',
  PRIMARY KEY (`IDChildTable`),
  KEY `ChildTable_IDParentTable` (`IDParentTable`),
  ) ENGINE=InnoDB DEFAULT CHARSET=latin1
---Would also like to have, but can't do both of these---
CONSTRAINT `ChildTable_IDParentTable` FOREIGN KEY (`IDParentTable`) REFERENCES `ParentTable` (`IDParentTable`)

ParentTable

IDParentTable   IDChildTableBest
            1                  4

ChildTable

IDChildTable    IDParentTable
           1                1
           2                1
           3                1
           4                1
           5                1

作为一个简单的例子...... ParentTable可以描述物理对象。 ParentTable(1)可以用于特定的椅子。 ChildTable可以保存或链接到照片。 ChildTable(1) - (5)可以是由ParentTable(1)代表的椅子的不同照片,可能具有不同的相机,灯光,背景等。

ParentTable(1)与ChildTable(4)具有一对一的关系,表示照片4现在是所选的“最佳”。用户可以改变主意,或添加可能会或可能不会获得“最佳”标题的未来照片。

ParentTable(1)与ChildTable(1) - (5)也有一对多的关系,这些都是可供选择的照片。

0 个答案:

没有答案