mysql - 数据库设计-自定义属性表- "relate"实体表

标签 mysql database database-design

我正在设计一个数据库(用于 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 id,但我不确定这是否是最佳解决方案...

我已阅读这篇文章和评论:http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx

最好的解决方案是什么?

编辑:

补充:我不知道 *nodes_customvars* id,只有 nodes idcustomvars <强>身份证。分析 *nodes_customvars* 表:

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

2- 如果我不创建任何唯一键,“插入...在重复键更新时”将始终插入,因为在语句中还没有找到唯一键...

最佳答案

您有两种选择来解决“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,

-地平

关于mysql - 数据库设计-自定义属性表- "relate"实体表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17266795/

相关文章:

php - MySQL 按 asc 排序(如果优先级字段 1 移动到顶部)

mysql - 优化联合 SQL 查询

mysql - 如何限制mysql表中每个用户有1000条记录

database - tomcat JNDI 数据库配置

c# - 在 DBcontext 中声明 DBSet<Type> - Entity Framework Code First

c# - 是否有一个独立的工具可以从现有数据库生成 Entity Framework 代码优先实体?

php - 在 Laravel 中检索数据格式

mysql - 如何将 GROUP BY 与 HAVING 一起使用?

php - 如何扩展 Adminer 以支持带登录的 SQLite 数据库?

java - Hibernate OneToOne 映射到不同的表