Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于多列主键MySQL的数据透视表设计_Mysql_Database Design_Indexing - Fatal编程技术网

基于多列主键MySQL的数据透视表设计

基于多列主键MySQL的数据透视表设计,mysql,database-design,indexing,Mysql,Database Design,Indexing,有人能立即看到下面模式中的问题或瓶颈吗?阅读是90%的操作,但我想知道我是否在书写的任何地方射中了自己的脚 这个命题 每个对象(另一个表中的行)都可以与其他对象相关。每个关系对只能有一条记录(对是方向敏感的,因此X到Y可以与Y到X共存) 典型的请求是获取所有相关对象(对于给定对象A): 在UI中使用简单的复选框数组管理关系。为了保存关系,我会计算当前集合中选中/未选中的对象之间的差异(对象将在UI中分页),然后只需相应地插入/删除 DELETE FROM relations WHERE a_id

有人能立即看到下面模式中的问题或瓶颈吗?阅读是90%的操作,但我想知道我是否在书写的任何地方射中了自己的脚

这个命题

每个对象(另一个表中的行)都可以与其他对象相关。每个关系对只能有一条记录(对是方向敏感的,因此
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)