3

私はパーティー会場用のオンライン予約システムを作成しています。クライアントは、ユーザーが特定の「パッケージ」を利用できるようにしたいと考えています。これらのパッケージには「サブオプション」があり、それらを保存する方法がわかりません。たとえば、1 つのパッケージが「風船」の場合、「赤い風船」、「緑の風船」など、またはピザ > 大、中、小など、さまざまなオプションをその下に格納できる必要があります。

もちろん、私はデータベースを使用しています。現在、パッケージ用のテーブルと予約用のテーブルが設定されています。bookings テーブルには、"packages" テーブルに保存されているレコードを参照するパッケージの ID のリストを含む列があります。

現在、これを行う最善の方法は、次の形式で、サブオプションを含む予定表に別の列を追加することだと考えています。

packageid:optionid;package2id:option2id

同様に、パッケージ テーブルの別の列には、次の形式のオプションがあります。

1:red,2:blue,3:green //for options with no add'l price
1:large[$20],2:medium[$15],3:small[$10] //for options that change the price

これでうまくいくと思いますが、これを行うにはもっと良い方法が必要だと思います。誰かがアイデアを持っている場合、または以前にそのようなことをしたことがある場合は、助けていただければ幸いです。

4

4 に答える 4

7

可変数のオプションがある場合は、そうであるように見えますが、多くの場合、次のことが行われます。

パッケージとオプションを ID でリンクするテーブルを作成します。したがってpackagesoptionsテーブルとテーブルがあり、package_options(id と保存した作成/変更日時を超えて) と のみを持つテーブルが作成さpackage_idれますoption_id

次に、3 つのテーブルを結合して、パッケージごとのオプションを取得します。私はこの方法が特に好きというわけではありませんが、リレーショナル データベースの分野でこれより優れた方法を見つけたことがありません。

于 2012-06-22T20:09:27.173 に答える
1

これを解決するにはいくつかの方法があります。基本的に、ソリューションが柔軟であるほど、複雑になります。あなたはこれについて助けを求めているので、より簡単な解決策を提供します。

次のようなテーブルを作成します。

ID, PackageName, OptionName
1,  Balloons, Red Balloons
2,  Balloons, Blue Balloons
3,  Pizza, Plain
4,  Pizza, Pepperoni
5,  Clown, NULL

次に、選択するパッケージのリストが必要な場合は、tblPackages GROUP BY PackageName から PackageName を選択できます。ユーザーがパッケージを選択した後、PackageName = 1 の tblPackges から OptionName を選択できます。

このように、ユーザーは個々のパッケージを実際に選択することはできません。実際にはオプションを選択していますが、パッケージを選択してからオプションを選択しているように見えます。

この概念に慣れれば、packages テーブルを作成してから options テーブルを作成し、それらを結合できることがわかるでしょう。しかし正直なところ、小規模なアプリケーションの場合、そうするパフォーマンス上の理由はありません。上記の方法は、多数の結合で発生する ID の寄せ集めよりも理解しやすいものです。

それが役に立てば幸い。

于 2012-08-24T23:13:54.927 に答える
1

保存するエンティティと、それらの間の関係をリストアップすることから始めます。あなたの説明から、予定の保存に関与する 3 つのエンティティがあります。

  1. 予定
  2. 選択したパッケージ
  3. 選択したオプション

2 つの関係がある場合:

  1. 各予定には任意の数のパッケージを含めることができます
  2. 各パッケージの任意の数のオプション

エンティティはメイン テーブルであり、それらの間の関係は外部キーです。

  • テーブルの予定 (ID Int、予定の詳細 ...)
  • テーブル selected_pa​​ckages (ID Int、予定_ID Int、パッケージの詳細...)
  • テーブル selected_options ( selected_pa​​ckage_id Int, オプションの詳細 ... )

ここでは、選択したパッケージとオプションを注意深く参照したことに注意してください。利用可能なパッケージとオプションを表す他の表があるかもしれません。「パッケージの詳細」と「オプションの詳細」と書いた場所では、外部キーを保存するだけでかまいません。それらへの参照(ただし、予約時の詳細記録できるように、特に価格などの重要な詳細のスナップショットを撮りたい場合があります)。

于 2012-08-25T18:15:18.007 に答える
-1

使用しているデータベースの種類については言及していません (説明でテーブルについて言及している場合を除きます)。

そのため、単にベスト プラクティスに基づいて回答を得たいと考えている場合は、リレーショナル DB の代わりにスキーマフリー(NoSQL) MongoDBを使用することをお勧めします。

それ以外の場合は、私のコメントを無視して他のコメントを読んでください。SQL結合によって相互に接続された 2 つの別個のテーブルが必要になると思います。

于 2012-08-28T16:48:02.403 に答える