{与我一小时前提出的问题完全不同的问题}
使用MySQL,从MyISAM转移到InnoDB表。数据库设计始于转储数据并在没有外键或约束的情况下重新导入数据。一次添加一个以查找错误。
处理ParentTable
和ChildTable
的正确方法是什么,其中ParentTable
与ChildTable
之间存在一对多的关系,并且从ParentTable
到ChildTable
的一对一关系?
当ParentTable
有多个ChildTable
选项,并且当前选择的ChildTable
选项时,可能会发生这种情况。
我的情况是有多张照片的东西,我希望记录所有这些照片,以及我觉得最好的照片。 (分辨率,清晰度,颜色准确性。)对于我的情况,概念上不是ParentTable
,直到ChildTable
,反之亦然。
在我目前的MyISAM设计中,ParentTable
有IDChildTable
来创建最佳选择的一对一关系,ChildTable
有IDParentTable
来创建一个所有可用选择的多对多关系。首次创建时,会创建ParentTable
,然后创建ChildTable
,然后使用ParentTable
更新IDChildTable
。
如果我添加外键约束,我无法同时创建新记录。
我能想到的只有:
Best
中设置ChildTable
布尔值,这会引入多个Best
中出现零个或多个ChildTable
选项的不良可能性单个ParentTable
不要喜欢这些选择。想法?
修改
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)也有一对多的关系,这些都是可供选择的照片。