我有一个 MySQL 数据库,该数据库中的一个特定表需要以一对多的方式进行自引用。为了可扩展性,我需要找到最有效的解决方案。对我来说最明显的两种方法是:

1)向表中添加一个文本字段,并在那里存储主键的序列化列表

2)保留一个链接器表,每一行都是一对一的。

在情况 #1 中,我看到表增长得非常非常宽(使用空间类比),但在情况 #2 中,我看到链接器表增长到非常大量的行,这会减慢查找速度(迄今为止最慢)共同操作)。

在 MySQL 中实现这种一对多关系最有效的方式是什么?或者,也许有一个更明智的解决方案,以某种方式将数据全部直接保存在文件系统上,或者其他存储引擎上?

有帮助吗?

解决方案

只要保持的表的“多”,与用于主表中的键列。

我quarantee你有很多其他更重要的问题,你在一个标准的工业强度的关系数据库管理系统运行效率成或容量限制之前解决。

IMHO最有可能的第二个选项(与众多替代产品)是使用一个ISAM。

其他提示

如果您需要对数据进行深度/递归遍历,那么像这样的图形数据库 新4j (我所在的团队)是一个不错的选择。您将在文章中找到一些信息 您应该超越关系数据库吗? 并在 这篇文章位于高可扩展性. 。对于可能与您类似的用例,请阅读此内容 MetaFilter 上的线程. 。有关语言绑定和其他信息的信息,您还可以找到 Neo4j 维基邮件列表 有用。

与其说是一个答案,但几个问题,一个可能的方法......

如果你想表自参照,并且只使用一个字段...有一些选择。甲计算屏蔽“加入”字段描述了一种方式,以多行相互关联。

最好的解决方案可能会考虑数据和关系的本质是什么? 什么是数据和查找的本质是什么?什么样的关系,你试图遏制?协会?有关?父/子?

我的第一个意见是,你会得到更好的反应,如果你能描述数据如何被使用(添加/更新VS查找的频率,增加VS更新等),除了你已经描述过。话虽这么说,我首先想到的是只用一个通用表示去


CREATE  TABLE IF NOT EXISTS one_table (
  `one_id` INT UNSIGNED  NOT NULL AUTO_INCREMENT
           COMMENT 'The The ID of the items in the one table' ,
  ... other data
)

CREATE  TABLE IF NOT EXISTS many_table (
  `many_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
            COMMENT 'the id of the items in the many table',
  `one_id` INT UNSIGNED  NOT NULL
           COMMENT 'The ID of the item in the one table that this many item belongs to' ,
  ... other data
)

确保,当然,上创建两个表中的one_id的索引。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top