可扩展的一对多表(MySQL)

时间:2009-07-12 17:55:08

标签: mysql scalability one-to-many

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

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

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

在#1的情况下,我看到表变得非常宽(使用空间类比),但是在#2的情况下,我看到链接器表增长到非常多的行,这将减慢查找速度(通过最常见的操作。)

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

4 个答案:

答案 0 :(得分:1)

只需为“many”保留一个表,其中包含主表的键列。

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

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

答案 1 :(得分:1)

如果你需要对数据进行深度/递归遍历,像Neo4j这样的图形数据库(我在团队中)是一个不错的选择。您可以在文章Should you go Beyond Relational Databases?this post at High Scalability中找到一些信息。对于可能与您的用例类似的用例,请阅读此thread on MetaFilter。有关语言绑定和其他内容的信息,您还可以找到有用的Neo4j wikimailing list

答案 2 :(得分: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上​​创建索引。

答案 3 :(得分:0)

不是一个答案,而是一些问题和可能的方法......

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

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