小编Tom*_*icz的帖子

为什么我不应该为多个关系使用一张表?

假设我的数据库中有多个关系,例如 Store、Employee 和 Sale,并且我想用简单的二元关系连接对。我个人会使用由外键组成的自然键创建名为 Employee_Store 和 Employee_Sale 的表。

现在,我的同事坚持为多个关系创建一张表。对于上面的示例,可能有一个名为 EmployeeLinks 的表:

EmployeeLinks(
    IdLink int PK, 
    IdEmployee int FK null,
    IdStore int FK null,
    IdSale int FK null,
    LinkType int not null
)
Run Code Online (Sandbox Code Playgroud)

请帮助我说明为什么这不是一个好主意的充分理由。我有自己的论点,但我想将它们保密并听取您的公正意见。

编辑:

最初上表没有主键 (!)。因为外键允许为空,所以代理键是唯一的选择。

database-design

14
推荐指数
2
解决办法
2650
查看次数

尝试获取锁时发现死锁;尝试在 mysql 中重新启动事务

我有一个如下所示的表结构,这个表有 100 万条记录,并且与两个和三个表有 FK 关系,这些表的记录也以百万计。我需要对这个表进行批量插入,但出现错误Deadlock found when trying to get lock; try restarting transaction,无法找到是什么造成了问题?

CREATE TABLE tags (
 id int(10) unsigned NOT NULL AUTO_INCREMENT,
  tag varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
  created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY hashtag (tag)
 ) ENGINE=InnoDB AUTO_INCREMENT=657163 DEFAULT CHARSET=utf8mb4      COLLATE=utf8mb4_unicode_ci`
Run Code Online (Sandbox Code Playgroud)

我用来做批量插入的查询是

 INSERT INTO tags (tag) VALUES ('jatin'),('test') ON DUPLICATE KEY UPDATE tag = VALUES(tag);`
Run Code Online (Sandbox Code Playgroud)

我运行命令show engine innodb status,结果如下所示 …

mysql innodb foreign-key deadlock unique-constraint

7
推荐指数
1
解决办法
2万
查看次数