假设我的数据库中有多个关系,例如 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)
请帮助我说明为什么这不是一个好主意的充分理由。我有自己的论点,但我想将它们保密并听取您的公正意见。
编辑:
最初上表没有主键 (!)。因为外键允许为空,所以代理键是唯一的选择。
我有一个如下所示的表结构,这个表有 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
,结果如下所示 …