我正在设计一个数据库(用于 mysql),它允许新的用户定义属性到一个名为 nodes 的实体。
为此,我创建了另外 2 个表。一个包含所有自定义属性的 customvars 表和一个定义 nodes 和 customvars 之间关系的 *nodes_customvars* 创建 1..n 和 n ..1 关系。
这是他绘制模型的链接:Sketched database model
到目前为止一切顺利...但我无法使用每个表的单独 ID 正确处理 INSERT 和 UPDATE。
例如,如果我在 *nodes_customvars* 表中为特定的 node 插入了一个名为 color 的自定义属性,如果我尝试“INSERT ... ON DUPLICATE KEY UPDATE"它将始终插入或始终更新。
我考虑过从 *nodes_customvars* 表中删除“ID”字段,并使用 nodes id 和 customvars使其成为复合键em> id,但我不确定这是否是最佳解决方案...
我已阅读这篇文章和评论:http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx
最好的解决方案是什么?
编辑:
补充:我不知道 *nodes_customvars* id,只有 nodes id 和 customvars <强>身份证强>。分析 *nodes_customvars* 表:
1- 如果我使 nodes id 和/或 customvars id 在此表中唯一,使用“INSERT ... ON DUPLICATE KEY UPDATE”将始终更新。由于多个节点可以共享同一个customvar,这是错误的;
2- 如果我不创建任何唯一键,“插入...在重复键更新时”将始终插入,因为在语句中还没有找到唯一键...
最佳答案
您有两种选择来解决“INSERT...ON DUPLICATE KEY”的特定问题,要么总是按照您的描述插入或更新。
使用 nodeId 和 customvarId 将主键更改为复合键(如 SyntaxGoonoo 所建议,并在您的问题中作为一个可能的选项)。
使用 nodeId 和 customvarId 添加复合唯一索引。
CREATE UNIQUE INDEX IX_NODES_CUSTOMVARS ON NODES_CUSTOMVARS(nodeId, customvarId);
这两个选项都允许“INSERT...ON DUPLICATE KEY”功能按您的要求工作(如果 nodeId 和 customvarId 的唯一组合不存在则插入;如果存在则更新)。
至于是复合主键还是单独的主键列加唯一索引这个问题,设计时要考虑的东西很多。有 1NF 考虑因素和您所使用的数据库平台的物理特性以及您碰巧使用的 ORM 的偏好(如果有的话)。考虑到 InnoDB 二级索引的工作方式(请参阅最后一段:http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html),我建议您保留当前的设计并添加额外的唯一索引。
HTH,
-地平
关于mysql - 数据库设计-自定义属性表- "relate"实体表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17266795/