ユースケース:
スケジュールされた公開イベントに登録できるWebページを作成しています。
データベーステーブルは Persons -> Subscriptions -> Events -> Days -> Activities
制限:
この人は、それらのイベントに1日以上の共通のアクティビティがない限り、利用可能なすべてのイベントをサブスクライブできます。
ソリューション:
したがって、ユーザーがイベントにサブスクライブしようとすると、データベースは、このテーブルの時間StartMoment
とEndMoment
フィールドを使用して、同じ日のイベントを探して、既にサブスクライブしている他のアクティブなイベントを繰り返す必要がありDays
ます。
方法:
私はOracleを初めて使用します。私はFirebirdとMySQLに慣れており、以前はイテレータを使用する必要はありませんでした。私はプログラミングコード内でそのチェックの王様をやっただけですが、今はこのロジックをデータベースに入れてプラットフォームから独立させたいと思っています。
コードが乱雑になりすぎたり遅くなりすぎたりしないように、それを行う最も賢い方法は誰か教えてもらえますか?
データ(簡略化):
Table Persons: Id, name(varchar), identify(varchar), phone(varchar);
Table Subscriptions: Id, personId, eventId, reg_date(date);
Table Events: Id, description(string), hours, contacts(string);
Table Days: Id, eventId, day(date), begin(time), end(time), allday(bool);
Table Activities: Id, dayId, eventId, begin(time), end(time), duration(0 for allday, or minutes), description(varchar);
テーブル内の各レコードを反復処理する場合、最も簡単な方法はfor rc in (select * from mytable) loop end loop;
構文を使用することです。これはステートメントの暗黙カーソルです。詳細については、http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/static.htm#CHDBJBJEを参照してください。ロジックは次のようになります。
begin
for rcPersons in (select * from Persons) loop
for rcSubscriptions in (select * from Subscriptions where personId= rcPersons.Id) loop
for rcEvents in (select * from Events where id = rcSubscriptions.eventId) loop
null; --<do some logic here>
end loop;
end loop;
end loop;
end;
p.s if you provide scripts to create test tables and data it would be easy to find most effective solution. I think it could be done via one SQL, but need more info to be sure
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加