0

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

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

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

在案例 #1 中,我看到表变得非常非常宽(使用空间类比),但在案例 #2 中,我看到链接器表增长到非常多的行,这会减慢查找速度(迄今为止最普通操作)。

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

4

4 回答 4

1

只需为“许多”保留一个表,并为主表保留一个键列。

我保证在您遇到标准工业级关系数据库的效率或容量限制之前,您将有许多其他更重要的问题需要解决。

恕我直言,最有可能的第二种选择(有许多替代产品)是使用 isam。

于 2009-07-12T18:03:01.353 回答
1

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

于 2009-07-13T07:47:36.410 回答
0

我的第一条评论是,除了您已经描述的内容之外,如果您可以描述数据的使用方式(添加/更新与查找的频率、添加与更新等),您将获得更好的回应。话虽这么说,我的第一个想法是只使用一个通用的表示


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 上创建索引。

于 2009-07-12T18:04:14.610 回答
0

与其说是答案,不如说是几个问题和一种可能的方法......

如果你想让表格自引用并且只使用一个字段......有一些选项。计算的可屏蔽“连接”字段描述了一种将许多行相互关联的方法。

最好的解决方案可能会考虑数据和关系的性质?数据和查找的性质是什么?你试图包含什么样的关系?协会?有关的?父母/孩子?

于 2009-07-12T18:47:43.133 回答