Мне нужны сведения о том, как спроектировать слой базы данных.
В моем приложении у меня есть список T. Информация в T содержит информацию из нескольких таблиц базы данных.
Есть, конечно, несколько способов сделать это.
Два способа, о которых я думаю, это:
слой болтливой базы данных и кеширование:
List<SomeX> list = new List<SomeX>();
foreach(...) {
list.Add(new SomeX() {
prop1 = dataRow["someId1"],
prop2 = GetSomeValueFromCacheOrDb(dataRow["someId2"])
});
}
Проблема, с которой я столкнулся выше, заключается в том, что если нам нужен список из 500 элементов, он может потенциально выполнить 500 запросов к базе данных. Со всей задержкой в сети и этим.
Другая проблема заключается в том, что пользователи могли быть удалены после того, как мы получили список из базы данных, но до того, как мы пытаемся получить его из cache / db, что означает, что у нас будут нулевые проблемы. С которым мы должны справиться вручную.
Хорошо, что он хорошо кэшируется.
не болтливый, но не кешируемый:
List<SomeX> list = new List<SomeX>();
foreach(...) {
list.Add(new SomeX() {
prop1 = dataRow["someId1"],
prop2 = dataRow["someValue"]
});
}
Проблема, с которой я столкнулся выше, заключается в том, что ее трудно кэшировать, поскольку потенциально все пользователи имеют уникальные списки. Другая проблема заключается в том, что будет много соединений, что может привести к большому количеству операций чтения в базу данных.
Хорошо, что мы точно знаем, что вся информация существует после выполнения запроса (внутреннее соединение и т. Д.)
не очень болтливый, но все еще кешируемый
Третий вариант может заключаться в том, чтобы сначала пройти по строкам данных и собрать все необходимые данные someId2, а затем сделать еще один запрос к базе данных, чтобы получить все значения SomeId2.