【问题标题】:Database Design - Custom attributes table - Table that "relate" entities数据库设计 - 自定义属性表 - “关联”实体的表
【发布时间】:2013-06-20 10:44:22
【问题描述】:

我正在设计一个数据库(用于 mysql),它允许为名为 nodes 的实体提供新的用户定义属性。

为此,我创建了另外 2 个表。一个包含所有自定义属性的 customvars 表和一个定义 nodescustomvars 之间关系的 *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 idcustomvars em> id,但我不确定这是否是最好的解决方案......

我读过这篇文章,还有 cmets:http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx

什么是最好的解决方案?

编辑:

补充:我不知道 *nodes_customvars* id,只有 nodes idcustomvars id。分析 *nodes_customvars* 表:

1- 如果我在此表中使 nodes id 和/或 customvars id 唯一,使用“ INSERT ... ON DUPLICATE KEY UPDATE”将始终更新。由于多个nodes可以共享同一个customvar,这是错误的;

2- 如果我不创建任何唯一键,“INSERT ... ON DUPLICATE KEY UPDATE”将始终插入,因为在语句中没有找到唯一键...

【问题讨论】:

  • nodes_customvars 描述了节点和自定义变量之间的多对多关系。所以从技术上讲,nodes_customvars 的 PK 应该是一个复合键

标签: mysql database database-design


【解决方案1】:

您有两种选择来解决“INSERT...ON DUPLICATE KEY”的特定问题,或者按照您的描述始终插入或更新。

  1. 使用 nodeId 和 customvarId 将主键更改为复合键(正如 SyntaxGoonoo 所建议的,并且在您的问题中作为一个可能的选项)。

  2. 使用 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,

-地平

【讨论】:

    【解决方案2】:

    你当前的实体设计打破了 1NF。这意味着您的架构可能会错误地存储重复数据。

    nodes_customvars 描述了nodescustomvars 之间的多对多关系。这种类型的表有时被称为辅助表,因为它的内容纯粹是从基表(在本例中为节点和自定义变量)派生的。

    描述多对多关系的辅助表的 PK 应该是复合键,以防止重复。基本上是 1NF。

    表上的任何 PK 本质上都是唯一的。无论它是单个键还是复合键。因此,在某些方面,您的问题没有意义,因为您正在谈论为 idnodescustomvars 打开/关闭 UNIQUE 约束。如果您的 id 实际上是 PK,您就无法做到这一点。

    那么你到底想在这里实现什么?

    【讨论】:

    • 好吧...我不知道...创建 nodes_customvars 表只是为了尊重 NF,因为节点 x customvars 是多对多关系。但我不知道我必须使用复合键而不是新的 PK...我正在尝试为节点创建用户定义的属性...我不知道实现这一目标的最佳实践是什么。 .. 其他链接:-stackoverflow.com/questions/5106335/…stackoverflow.com/questions/870808/…
    猜你喜欢
    • 2012-06-06
    • 2012-07-31
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多