1

问题

我有两个数据表SEQUENCESORGANISMS其多对多关系在表中映射SOURCESSOURCES和之间也有 1 米的关系ENTRIES。我将附加一个详细的结构。

我想要实现的是显示具有所有相关生物体和条目的所有序列,其中满足序列表中的条件。我对如何实现这一点有一些想法,但我需要性能最佳的解决方案,因为每个解决方案都包含 50k+ 个条目。

想法一

在sql中选择属于同一序列的所有有机体作为连接字符串,并在PHP中将其拆分。我不知道如何在 SQL 中进行连接。

想法二

选择具有不同生物的相同序列作为不同的记录,按生物排序,稍后在 php 中加入它们。尽管这在某种程度上感觉是错误的。

想法三

使用视图。对此的任何想法表示赞赏

结构体

SEQUENCES
  SEQUENCE_ID
  DESCRIPTION

ORGANISMS
  ORGANISM_ID
  NAME

SOURCES
  SOURCE_ID
  SEQUENCE_ID FK to SEQUENCES.SEQUENCE_ID
  ORGANISM_ID FK to ORGANISMS.ORGANISM_ID

ENTRIES
  SOURCE_ID FK to SOURCES.SOURCE_ID
  ENTRY_VALUE

期望的结果

array(
  array(
    "SEQUENCE_ID" => 4,
    "DESCRIPTION" => "Some sequence",
    "SOURCES" => array(
      array(
        "ORGANISM_ID" => 562,
        "ORGANISM_NAME" => "Escherichia coli",
        "ENTRIES" => array(
          "some entry",
          "some other entry"
        ),
      array(
        "ORGANISM_ID" => 402764,
        "ORGANISM_NAME" => "Aranicola sp. EP18",
        "ENTRIES" => array()
      )
    )
  ),
  array(
    "SEQUENCE_ID" => 5,
    .....
  )
)

PHP5 和 FIREBIRD2.5.1

4

1 回答 1

1

您不能直接从平面表结构中获取这样的嵌套数组。但如果我说对了,你想做的事情并不难实现。

我不明白您为什么要连接事物然后再次拆分它们,这很难维护并且可能很慢。

我在这里看到两种方法:

  1. 使用 JOIN 一次获取所有内容作为平面表,并在 PHP 中循环遍历它。这种方法会产生大量重复,但速度很快,因为您可以在一个查询中获取所有数据,然后使用 PHP 进行处理。

  2. 分别获取每个实体,循环并获取下一个层次结构级别。这种方法会比较慢。它消除了 SQL 查询的复杂性,并且不获取冗余数据。它还让您在如何循环数据以及如何处理数据方面拥有更多自由。

或者,您可能希望以 no-sql 方式实际存储分层数据,您已经可以在其中存储您提到的数组结构。

于 2013-10-11T09:05:54.867 回答