私のデータベースには、 というテーブルがありますThingsInACircle。Thingaが に追加されるたびに、自動インクリメントThingsInACircleされる a が追加されます。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 とオフセットについて、ThingId から (ThingId + オフセット) までの ThingsInACircle 内のすべてのレコードを返します (オフセットは負の場合があります)。
したがって、これを設定例として取り上げます。
ThingId のリストは次のとおりです: 1 2 3 4 5 6 7 8 9
@ThingId = 2 および @offset = 3 のすべての ThingId が必要な場合、問題はありません。
SELECT ThingId FROM ThingsInACircle WHERE
ThingId BETWEEN @ThingId AND (@ThingId + @offset)
2 3 4 5 が返されます。
しかし、@ThingId = 8 で @offset = 3 のすべての ThingId が必要な場合は、問題があります。
関数は次を返す必要があります: 7 8 9 1
したがって、ここに私のジレンマがあります。データ アクセス レイヤーに、より複雑なストアド プロシージャ (最小値、最大値を選択し、if & else を使用して超過したかどうかを判断する)を使用して、処理するために取得するレコードを正確に決定するクエリが含まれている必要があります。円にリンクされているレコード?
または、ビジネス ロジック層は、ユーザーが最小値または最大値を超える ID + オフセットを要求したかどうかを判断し、単純な DAL メソッドを使用して返す必要があるものを達成する必要がありますか?
これは単なる意見の問題かもしれません。マイクロソフトのチュートリアルに従って、2 日前に 3 層構造について学び始めたばかりなので、一部の人々が DAL と BLL をどのように形成する必要があると考えているかを知りたいだけです。 ... またはその逆... または、私が一緒に逃した何か。