Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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 如何存储sql表的图形_Mysql_Sql_Database_Performance_Graph - Fatal编程技术网

Mysql 如何存储sql表的图形

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,如何有效地解决这个问题?只添加

假设我们有很多表(T1,T2…T50),我们希望它们之间有n对n的关系

实现这一点的支撑方式是什么。 如果表的数量增加到100个或更多,那么为每对Tx和Ty设置一个关系表是不现实的

我目前的解决办法是

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
  • 表关系可能会变得相当大
赞成的意见
  • 要更正条目及其所有关系,删除可关联条目就足够了,所有相关条目和相应表都将被删除
  • 连接两个表时,不需要关系表

请编辑您的问题并提供具体示例。有多个连接表没有问题。我怀疑所有成对的表都需要100*99/2,但如果没有一个真实的例子,就很难弄清楚逻辑。@GordonLinoff问题是我们可能需要添加新表,而使用多个连接表的额外工作将导致大量的owerhead,获取一个对象的所有邻居将是一个非常复杂的查询。对于这个用例,请看这个。现在我尽量简化这个问题。但我们有50多个不同的对象,它们之间有映射。在不同的表中存储不同的对象可能不是正确的解决方案。泛型关系表可以用于存储数据,但不能保证引用完整性、允许外键约束或允许有效使用索引。我怀疑您的数据模型可以改进。如果我们想支持完全连通图,该怎么办。这就是给我带来问题的原因。一切都与其他一切直接相关?2500个连接?你在做什么模特?可能数据库不是连接的合适位置。数据库仍然可以作为有关实体信息的存储库。