Ich brauche etwas Input, wie man eine Datenbankschicht entwirft.Datenbank, Anforderungen, Leistung, Cache
In meiner Anwendung habe ich eine Liste von T. Die Informationen in T haben Informationen aus mehreren Datenbanktabellen.
Es gibt natürlich mehrere Möglichkeiten, dies zu tun. Zwei Möglichkeiten, die ich mir vorstellen ist:
gesprächig Datenbankschicht und zwischenspeicherbar:
List<SomeX> list = new List<SomeX>();
foreach(...) {
list.Add(new SomeX() {
prop1 = dataRow["someId1"],
prop2 = GetSomeValueFromCacheOrDb(dataRow["someId2"])
});
}
Das Problem, das ich mit dem oben sehen, ist, dass, wenn wir eine Liste von 500 Titel wollen, könnte es potenziell 500 Datenbankanfragen stellen Mit der ganzen Netzwerklatenz und dem. Ein weiteres Problem ist, dass die Benutzer gelöscht werden konnten, nachdem wir die Liste aus der Datenbank bekommen haben, aber bevor wir versuchen, sie aus cache/db zu bekommen, was bedeutet, dass wir Null-Probleme haben werden. Was wir manuell handhaben müssen. Die gute Sache ist, dass es gut cachefähig ist.
nicht gesprächig, aber nicht zwischenspeicherbar:
List<SomeX> list = new List<SomeX>();
foreach(...) {
list.Add(new SomeX() {
prop1 = dataRow["someId1"],
prop2 = dataRow["someValue"]
});
}
Das Problem, das ich mit dem oben sehen, ist, dass seine schwer zu Cache, da möglicherweise alle Benutzer einzigartige Listen haben. Das andere Problem ist, dass es viele Joins geben wird, die zu einer Menge von Lesevorgängen gegen die Datenbank führen können. Die gute Sache ist, dass wir sicher wissen, dass alle Informationen existieren, nachdem die Abfrage ausgeführt wird (innere Verknüpfung usw.)
nicht so gesprächig, aber immer noch zwischenspeicherbar
Eine dritte Möglichkeit zur ersten Schleife könnte durch die Datenzeilen und sammeln alle notwendigen someId2 und machen dann eine weitere Datenbankanforderung, um alle SomeId2-Werte zu erhalten.
Gibt es einen guten Grund, das O/RM-Rad neu zu erfinden? Das Problem wurde von Entity Framework, NHibernate und einer Reihe anderer Projekte gelöst. – Bergius
Es gibt Vor- und Nachteile eines O/R-Mappers. Und das Problem/die Frage existiert immer noch, wenn wir die Site nur mit gespeicherten Prozeduren ausführen möchten. – Patrik
Können Sie Einzelheiten dazu angeben, wie die Daten in Ihren Tabellen strukturiert sind? Ich nehme an, dass someId1 eine Benutzer-ID darstellt und someValue Eigenschaften dieses Benutzers (?) Darstellt und dass diese Eigenschaften in verschiedenen Tabellen gespeichert sind. Abhängig von Ihrer Antwort könnte es besser sein, ein paar Tabellen neu zu gestalten. – NotMe