基于多列主键MySQL的数据透视表设计
有人能立即看到下面模式中的问题或瓶颈吗?阅读是90%的操作,但我想知道我是否在书写的任何地方射中了自己的脚 这个命题 每个对象(另一个表中的行)都可以与其他对象相关。每个关系对只能有一条记录(对是方向敏感的,因此基于多列主键MySQL的数据透视表设计,mysql,database-design,indexing,Mysql,Database Design,Indexing,有人能立即看到下面模式中的问题或瓶颈吗?阅读是90%的操作,但我想知道我是否在书写的任何地方射中了自己的脚 这个命题 每个对象(另一个表中的行)都可以与其他对象相关。每个关系对只能有一条记录(对是方向敏感的,因此X到Y可以与Y到X共存) 典型的请求是获取所有相关对象(对于给定对象A): 在UI中使用简单的复选框数组管理关系。为了保存关系,我会计算当前集合中选中/未选中的对象之间的差异(对象将在UI中分页),然后只需相应地插入/删除 DELETE FROM relations WHERE a_id
X
到Y
可以与Y
到X
共存)
典型的请求是获取所有相关对象(对于给定对象A
):
在UI中使用简单的复选框数组管理关系。为了保存关系,我会计算当前集合中选中/未选中的对象之间的差异(对象将在UI中分页),然后只需相应地插入/删除
DELETE FROM relations WHERE a_id = A AND b_id IN(B,C)
# if these relations already exist, will fail silently
INSERT IGNORE INTO relations (a_id, b_id) VALUES (A,D), (A,E)
我可能还需要查询反向关系,只使用选择的
b_id
——因为它不在索引的左边,所以会使用它吗?如果没有,在其上添加单独的索引是否会导致大量的写入开销?在b\u id
上添加第二个索引的优势将超过任何写入开销,因为没有索引,它将需要执行完整的表扫描以按b\u id
进行过滤
就仅在
b_id
或b_id上建立索引而言,a_id
取决于表引擎,因为InnoDB
将主键存储在二级索引中,而MyISAM
则不然。在b_id
上添加第二个索引的优势将超过任何写入开销,由于没有索引,它将需要执行完整的表扫描,以按b_id
进行过滤
至于只在
b_id
或b_id上建立索引,a_id
取决于表引擎,因为InnoDB
将主键存储在二级索引中,而MyISAM
不存储。表是什么引擎?您可能希望在单个事务中执行删除/插入。表是什么引擎?您可能希望在单个事务中执行DELETE/INSERT
。请原谅我的无知,但是对于InnoDB,b\u id
就足够了?假设我必须使用MyISAM(系统是分布式的,InnoDB不保证)-添加b\u id,a\u id
索引会妨碍InnoDB吗?i、 e.为其中一个/或做出妥协?请原谅我的无知,但是对于InnoDB,b_id
就足够了?假设我必须使用MyISAM(系统是分布式的,InnoDB不保证)-添加b_id,a_id
索引会妨碍InnoDB吗?i、 e.为其中一方/或另一方做出妥协?
SELECT * FROM objects INNER JOIN relations ON id = b_id WHERE a_id = A
DELETE FROM relations WHERE a_id = A AND b_id IN(B,C)
# if these relations already exist, will fail silently
INSERT IGNORE INTO relations (a_id, b_id) VALUES (A,D), (A,E)