Я работал с различными приложениями и сталкивался с этой ситуацией много раз. До сих пор я не придумал, какой подход лучше всего.
Вот сценарий:
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
и Владелец
. Похоже, это ненормализованная база данных.
Теперь возникает вопрос, как мне избежать циклических обращений и в то же время избежать избыточных данных?