1

これが質問または回答されたことが他にもある場合は、申し訳ありません-サーバーでPHPタスクをスケジュールしようとしている人に私の検索が失われ続けていると思うので、探しているものが見つかりません.

私の最初の自作アプリ (ガイド付きまたは指示付きのアプリではありません) として、キャンプのスケジューリング プログラムを構築しようとしています。ログイン、キャビン/グループの追加または削除、アクティビティ/グループの追加または削除、日付範囲の生成、およびそのデータから、スケジュールしたいものを選択して送信するためのものが既に構築されていますそれをスケジューラに渡し、新しい MySQL テーブルを作成して...

これは、私が立ち止まって、これについて正しく考えているかどうか疑問に思っているところです.

  • スケジュールを新しく実行するたびに新しいテーブルを作成する必要がありますか?これはスケーラブルですか?
  • MySQL テーブルにデータを入力する前に、配列をソートする必要がありますか?それとも、連続して入力してから、次の項目をソートしながら入力することはできますか?

最終的に、次のような他の要因を追加する必要があるため、ラウンドロビンだけを行うことはできません。

  • このグループは、スケジュールされた最後の X 期間にこのアクティビティを実行しましたか? その場合は、別のものを選択してください。
  • 常にアクティビティ リストの先頭から開始するとは限りません。そうしないと、一部のアクティビティが常にスケジュールされ、一部のアクティビティが常に最初に空のままになります。いくつかの要因を考慮して、重要性に優先順位を付けることができる場合もあります。
  • 最初は、グループで日付のアクティビティをスケジュールしたいだけですが、別のスケジュール (キャビンが行うカヌー旅行) を考慮して、その日のスケジュールリストから除外できる機能も追加したいと思います。それらはなくなります。

並べ替えロジックで得られるヘルプは大歓迎です。ありがとう。

編集: あなたの提案に基づいて、IDと名前の列が2つしかない次のテーブルがあると考えています(ユーザーはいつでも更新/編集できます):

cabins
activities

次に、たとえば、日付エントリ (8 週間) 用の最大 56 列 + という名前とユーザーの列を持つ別のテーブルを追加します。

dates

次に、次のような別のテーブルがあります。

schedule

次のような列があります。

ID (primary Key)
User (logged in user that created this)
schedule_name (user defined name of schedule)
cabin (foreign key of a cabin)
period_001 (foreign key of first date in corresponding 'dates' table)
activity_001 (foreign key of an available activity which has been chosen to go here)
period_002 (...)
activity_003 (...)
etc...

次に、PHP ロジックは名前とユーザーでグループ化された行を要求するため、特定のユーザーのスケジュール名ごとに、キャンプで選択されたキャビンごとに 1 行 (例: 25 キャビンの場合は 25 行) になります。また、「dates」テーブルの各行には、特定のスケジュールの日付範囲全体が含まれています。

これはあなたが考えていたことですか?

4

1 に答える 1

1

私の理解が正しければ、これはデータベース モデリングに関する質問です。具体的な質問から始めるには:

スケジュールを新しく実行するたびに、新しいテーブルを作成する必要がありますか?

いいえ。テーブルはモノのタイプを表します (OO 実装のクラスと同様)。そのテーブル内の行のグループを区別する必要がある場合、それはそれらの行の属性であり、おそらくそれ自体が別のエンティティです。したがって、「スケジュールの新しい実行」ごとに行を含むテーブルがあり、それを他のテーブルで外部キーを使用して参照します。

MySQL テーブルにデータを入力する前に、配列をソートする必要がありますか?

いいえ。データベース テーブルに入力された行は、決して意味を伝えるために使用されるべきではありません。特定の順序がある場合、その順序を作成するための情報はテーブルの列にある必要があります。句を使用して、データベースからデータを取得するときにデータを並べ替えます。Order By(データを ing するときは常に節を含めてください。)Order BySelect

箇条書きの 2 番目のセットは、データをモデル化する方法からデータをクエリする方法にジャンプしているようです。まず、以下を読んでください。

  • データベースの正規化: 簡単に言えば、すべてのエンティティには独自のテーブルが必要であり、それらの間の関係は外部キーによって定義されます。
  • エンティティ関係図: すべての公式シンボルを習得する必要はありませんが、Visio の図や紙にデータを書き出すと、物事がどのように関係しているかを理解するのに役立ちます。

エンティティが何であるか、およびそれらの正規化された構造について適切なアイデアが得られたら、残りはそれらに関連するクエリを記述する方法についてのみです。

  • 「このグループは、スケジュールされた最後の X 期間にこのアクティビティを実行しましたか?」テーブル、ピボット テーブル (つまり、多対多の関係で 2 つ以上のテーブルを関連付けるためだけに存在するテーブル)、およびテーブルのJOIN間が含まれる場合があります。groupsgroups_scheduled_activitiesscheduled_periods
  • 「常にアクティビティ リストの一番上から開始するとは限りません。重要度の優先順位を付けることができるかもしれません」はactivities、UI にテーブルを表示するときにテーブルからどのように選択するかについてのすべてです。おそらく、Order By優先度要因に関する条項です。そしてランダム因子。(一部の DB ではランダムな順序付けが難しい場合がありますが、見回すと解決策がたくさん見つかります。)
  • 私が正しく理解している場合、「別のスケジュールを考慮して、それらがなくなる日のスケジュールリストからそれらを除外する」ことは、長時間続く特定の種類の「アクティビティ」であり、UI で異なる方法で表示された可能性があります。データ モデリングの観点からは、アクティビティactivitiesを「通常の」アクティビティと区別するために、アクティビティの属性 (つまり、テーブルの列) が必要なだけです。いずれにせよ、アクティビティには「期間」属性があると思われます。
于 2013-09-21T17:35:27.177 に答える