我曾经使用各种应用程序,并多次遇到过这种情况.到目前为止,我还没有想出什么是最好的方法.
这是场景:
>我有桌面或网络应用程序
>我需要从数据库中检索简单文档.该文档包含一般细节和项目详细信息,因此数据库:
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 |
如您所见,表格具有一对多的关系.现在,为了检索所有文件及其各自的项目,我总是做两个中的任何一个:
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"]) } }
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和Owner.它看起来像一个非标准化的数据库.
现在,问题是,如何避免往返,同时避免冗余数据?