Mysql 如何存储sql表的图形
假设我们有很多表(T1,T2…T50),我们希望它们之间有n对n的关系 实现这一点的支撑方式是什么。 如果表的数量增加到100个或更多,那么为每对Tx和Ty设置一个关系表是不现实的 我目前的解决办法是Mysql 如何存储sql表的图形,mysql,sql,database,performance,graph,Mysql,Sql,Database,Performance,Graph,假设我们有很多表(T1,T2…T50),我们希望它们之间有n对n的关系 实现这一点的支撑方式是什么。 如果表的数量增加到100个或更多,那么为每对Tx和Ty设置一个关系表是不现实的 我目前的解决办法是 relationships_table id_x, table_name_x, id_y, table_name_y 用于存储所有关系。这种添加新表的方法很简单,但缺点是什么 1)如果我们仅限于sql,那么支持这种用例的更好方法是什么 2)如果我们不局限于sql,如何有效地解决这个问题?只添加
relationships_table
id_x, table_name_x, id_y, table_name_y
用于存储所有关系。这种添加新表的方法很简单,但缺点是什么
1)如果我们仅限于sql,那么支持这种用例的更好方法是什么
2)如果我们不局限于sql,如何有效地解决这个问题?只添加基本关系表。tblA与tblB相关,tblB与tblC相关。所以,通常这意味着你可以通过
FROM tblA
JOIN tblB ON ...
JOIN tblC ON ...
这样不行吗?不需要超过50张桌子吗?而且更干净?您提出的解决方案是解决上述问题的最合理的解决方案。但这个问题似乎有点不合理 如果需要图形,则只需要两个表,一个用于节点,另一个用于边
如果某些节点是特定类型的,那么您可以为它们提供额外的专门化表。我遇到了相同的问题,我有一个稍微不同的方法。我添加了一个名为relationable的表,它只存储一个id,并且图中出现的所有表都引用了这个表。我自己确保在整个数据库中只有一个元素引用了一个可关联的条目(这实际上是我最担心的,但实际上这不是一个问题,只是看起来不好看)。然后是一个关系表,用于n对n之间的关系可关联 为了说明我的观点,我添加了一个在MySQL中创建的示例
CREATE TABLE relationable
(
relationable_id INT AUTO_INCREMENT PRIMARY KEY
) ENGINE=INNODB;
在关系表中,我添加了一个名称,因为我的顶点有一个名称,所以两个节点之间甚至可能有多个具有不同名称的顶点
CREATE TABLE relation
(
from_id INT NOT NULL,
to_id INT NOT NULL,
name VARCHAR(255) NOT NULL,
FOREIGN KEY (from_id) REFERENCES relationable(relationable_id) ON DELETE CASCADE,
FOREIGN KEY (to_id) REFERENCES relationable(relationable_id) ON DELETE CASCADE
)ENGINE=INNODB;
最后,图表中出现的表格如下所示
CREATE TABLE place
(
place_id INT NOT NULL,
name VARCAHR(255),
FOREIGN KEY (PLACE_ID) REFERENCES relationable(relationable_id)
ON DELETE CASCADE
) ENGINE=INNODB;
现在很明显这有正反两面
欺骗
- 您需要确保relationable只被引用一次。在一个表中,这由主键负责,但在所有表中,这并没有完成
- 您可能需要一个巨大的int作为relationable的id
- 表关系可能会变得相当大
- 要更正条目及其所有关系,删除可关联条目就足够了,所有相关条目和相应表都将被删除
- 连接两个表时,不需要关系表