代码之家  ›  专栏  ›  技术社区  ›  Chris Tonkinson

可扩展的一对多表(mysql)

  •  0
  • Chris Tonkinson  · 技术社区  · 15 年前

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

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

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

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

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

    4 回复  |  直到 15 年前
        1
  •  1
  •   dkretz    15 年前

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

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

    imho最有可能的第二种选择(有许多替代产品)是使用ISAM。

        2
  •  1
  •   nawroth    15 年前

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

        3
  •  0
  •   CMB    15 年前

    不是一个答案,而是几个问题和一种可能的方法……

    如果要使表自引用并且只使用一个字段…有一些选择。计算的可屏蔽“join”字段描述了一种将多个行相互关联的方法。

    最好的解决方案可能会考虑数据和关系的性质? 数据和查找的性质是什么?你想要控制什么样的关系?协会?相关的?父母/子女?

        4
  •  0
  •   RHSeeger    15 年前

    我的第一条意见是,如果您能够描述数据的使用方式(添加/更新的频率与查找、添加与更新等),以及您已经描述的内容,您将得到更好的响应。也就是说,我的第一个想法是使用

    
    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
    )
    

    当然,要确保在两个表中的一个ID上创建一个索引。