0

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

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

处理拥有ParentTableand的正确方法是什么,其中既有来自toChildTable的一对多关系,又有来自ParentTabletoChildTable的一对一关系?ParentTableChildTable

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

我的情况是某物有多张照片,我想记录所有这些照片,以及我认为最好的一张。(分辨率、清晰度、色彩准确性。)对于我的情况,在概念上没有 a ParentTable,直到有 a ChildTable,反之亦然。

在我目前的 MyISAM 设计中,ParentTable必须IDChildTable创建最佳选择的一对一关系,并且ChildTable必须IDParentTable创建所有可用选择的一对多关系。在第一次创建时,先创建a,然后ParentTable创建 a ChildTable,然后ParentTable使用 更新IDChildTable

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

我能想到的只有:

  • 在这种情况下没有约束
  • 删除一对一的关系,并有一个Best布尔值,其中引入了在单个条目的多个条目ChildTable中存在零个或多个Best选择的不希望的可能性ChildTableParentTable
  • 我可以允许一个或两个外键 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`)

父表

IDParentTable   IDChildTableBest
            1                  4

子表

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)也有一对多的关系,都是可供选择的照片。

4

0 回答 0