Как избежать множества циклических обращений к базе данных и большого количества нерелевантных данных?

Я работал с различными приложениями и сталкивался с этой ситуацией много раз. До сих пор я не придумал, какой подход лучше всего.

Вот сценарий:

  • У меня есть приложение на компьютере или в Интернете
  • Мне нужно получить простые документы из базы данных. В документе есть общие сведения и сведения об элементах, поэтому база данных:

GeneralDetails таблица:

| DocumentID | DateCreated | Owner     |
| 1          | 07/07/07    | Naruto    |
| 2          | 08/08/08    | Goku      |
| 3          | 09/09/09    | Taguro    |

ItemDetails таблица

| DocumentID | Item        | Quantity  |
| 1          | Marbles     | 20        |
| 1          | Cards       | 56        |
| 2          | Yo-yo       | 1         |
| 2          | Chess board | 3         |
| 2          | GI Joe      | 12        |
| 3          | Rubber Duck | 1         |

Как вы можете видеть, таблицы имеют отношение «один ко многим». Теперь, чтобы получить все документы и соответствующие им элементы, я всегда использую один из двух:

Метод 1 - много циклов приема-передачи (псевдокод):

 Documents = GetFromDB("select DocumentID, Owner " +
                       "from GeneralDetails") 
 For Each Document in Documents
{
    Display(Document["CreatedBy"])
    DocumentItems = GetFromDB("select Item, Quantity " + 
                              "from ItemDetails " + 
                              "where DocumentID = " + Document["DocumentID"] + "")
    For Each DocumentItem in DocumentItems
    {
        Display(DocumentItem["Item"] + " " + DocumentItem["Quantity"])
    }
}

Метод 2 - много нерелевантных данных (псевдокод) ):

DocumentsAndItems = GetFromDB("select g.DocumentID, g.Owner, i.Item, i.Quantity " + 
                              "from GeneralDetails as g " +
                              "inner join ItemDetails as i " +
                              "on g.DocumentID = i.DocumentID")
//Display...

Я использовал первый метод, когда учился в колледже, для настольных приложений, производительность была неплохой, поэтому я понял, что это нормально.

Пока однажды я не увидел статью «Сделайте Интернет быстрее», в которой говорится, что много обращений к базе данных - это плохо; поэтому с тех пор я использовал второй метод.

Во втором методе я избегал циклических обращений, используя внутреннее соединение для одновременного извлечения первой и второй таблицы, но это дает ненужные или избыточные данные. См. Набор результатов.

| DocumentID | Owner     | Item        | Quantity  |
| 1          | Naruto    | Marbles     | 20        |
| 1          | Naruto    | Cards       | 56        |
| 2          | Goku      | Yo-yo       | 1         |
| 2          | Goku      | Chess board | 3         |
| 2          | Goku      | GI Joe      | 12        |
| 3          | Taguro    | Rubber Duck | 1         |

Набор результатов имеет избыточный DocumentID и Владелец . Похоже, это ненормализованная база данных.

Теперь возникает вопрос, как мне избежать циклических обращений и в то же время избежать избыточных данных?

7
задан Lance Roberts 18 August 2011 в 06:54
поделиться