Пытаясь вернуть строки между данным идентификатором и идентичным идентификатором + смещение, куда больше всего логики должно обращаться, чтобы определить, как извлечь данные ?: BLL или DAL - PullRequest
0 голосов
/ 21 июня 2009

В моей базе данных есть таблица с именем ThingsInACircle. Каждый раз, когда Thing добавляется к ThingsInACircle, он добавляется с ThingId, который автоматически увеличивается.

Представьте, что Things в этой таблице находится в круге.
SELECT Thing FROM ThingsInACircle WHERE ThingId = 10 находится рядом с
SELECT Thing FROM ThingsInACircle WHERE ThingId = 11.
Также ...
SELECT Thing FROM ThingsInACircle WHERE ThingId = min(ThingId) рядом с
SELECT Thing FROM ThingsInACircle WHERE ThingId = max(ThingId)

Я хочу иметь возможность сказать: для заданного ThingId и смещения верните все записи в ThingsInACircle в диапазоне от ThingId до (ThingId + смещение) (смещение может быть отрицательным).

Итак, возьмем для примера пример:

Вот список наших ThingIds: 1 2 3 4 5 6 7 8 9

Если мне нужны все ThingIds, где @ThingId = 2 и @offset = 3, проблем нет

SELECT ThingId FROM ThingsInACircle WHERE
ThingId BETWEEN @ThingId AND (@ThingId + @offset)

и он вернется: 2 3 4 5

Но если мне нужны все ThingIds, где @ThingId = 8 и @offset = 3, тогда возникает проблема

Функция должна вернуть: 7 8 9 1

Итак, вот моя дилемма, если мой Уровень доступа к данным содержит запрос, который использует более сложную хранимую процедуру (Выбор min, max и использование if & else для определить, были ли они превышены) , чтобы точно определить, какие записи нужно извлечь, чтобы обрабатывать записи как связанные по кругу?

Или Уровень бизнес-логики должен определить, запросил ли пользователь смещение id +, которое превышает минимальное или максимальное, и затем использует простые методы DAL для выполнения того, что ему нужно вернуться?

Это может быть просто вопросом мнения. Я только начал изучать трехуровневую структуру два дня назад, следуя учебнику microsofts , поэтому я просто хочу понять, как некоторые люди думают, что DAL и BLL должны быть сформированы: если DAL должен быть простым и BLL Я должен сделать все проверки ... Или наоборот ... Или что-то, что я пропустил все вместе.

Ответы [ 3 ]

1 голос
/ 21 июня 2009
SELECT ThingId FROM ThingsInACircle 
WHERE
   ThingId BETWEEN @ThingId AND (@ThingId + @offset) 
   OR 
   ThingID BETWEEN 1 AND (@ThingID + @Offset - @MaxID)

@ MaxID - это максимальный идентификатор вещи (конец круга).

У вас есть два случая:

нормальный случай, когда у вас нет переполнения по смещению. Это полностью покрыто вторым между.

второй случай, когда у вас есть переполнение, и вам нужно применить смещение за границу. В этом случае у вас есть диапазон @ThingID - @ThingID + @offset, обрабатываемый первым BETWEEN, и 1 - ((@ThingID + @offset) - @MaxID), обрабатываемый вторым BETWEEN.

Если смещение больше, чем @MaxID, то должны учитываться все @ThingID, и этот случай также покрывается вторым интервалом.

0 голосов
/ 21 июня 2009

Большую часть времени (и в этой ситуации) я бы рекомендовал начинать с бизнес-логики (т. Е. Последняя вещь в круге находится рядом с первой) на бизнес-уровне.

Это означает выполнение как минимум двух запросов. Первый получает ваш диапазон thingID:

int maxThingId = // select max(thingId) 'maxThingId' from ThingsInACircle
int minThingId = // select min(thingId) in the same query

поэтому ваш второй запрос обычно будет:

select thingId 
from ThingsInACircle 
where thingId > @lowerBound and thingId < @upperBound

где параметры были предварительно вычислены как:

int lowerBound = requestedThingId;
int upperBound = lowerBound + offset;

и затем третий, если необходимо:

if(upperBound > maxThingId) { 
  upperBound -= maxThingId - minThingId; 
  // third query:
  // select thingId from ThingsInACircle where thingId < @upperBound
}

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

0 голосов
/ 21 июня 2009

Я обычно считаю, что с ними легче иметь дело, чем с DAL, особенно если вы имеете дело с RDBMS. С другими видами абстракций коллекций (массивами, коллекциями, словарями и т. Д.) Будет легче работать.

...